Имя: Пароль:
1C
 
v8: Посоветуйте быстрый способ загрузить текстовый файл
0 dineso
 
24.08.09
23:28
Нужно прошерстить текстовый файл в 4 мегабайта и упрятать его содержимое в справочник. Сейчас делаю так:

ИмяФайла = Константы.ФайлИсходник.Получить();
Файл = Новый ТекстовыйДокумент;
Файл.Прочитать(ИмяФайла);
Текст = Файл.ПолучитьТекст();
// Файл загружен, начали перебор
Для Ы = 1 По СтрЧислоСтрок(Текст) Цикл
   Строка = СтрПолучитьСтроку (Текст, Ы);
   ПоложитьСтрокуВНужноеМестоСправочника();
КонецЦикла;

Существуют ли более быстрые способы? Сейчас загурзка файла занимает 15 минут, даже если я ничего никуда не записываю, а просто перебираю "вхолостую".
1 Господин ПЖ
 
24.08.09
23:30
fso, ado
2 dineso
 
24.08.09
23:34
Спасибо, буду читать про ADO
3 dineso
 
24.08.09
23:52
Нашёл вот такой код:

ИмяФайла = Константы.ФайлИсходник.Получить();
fso = СоздатьОбъект("Scripting.FileSystemObject");
file = fso.OpenTextFile(ИмяФайла, 1, 0, 0);
Пока file.AtEndOfStream=0 Цикл
   Строка = file.ReadLine();
   МанипуляцииСоСтрокой();
КонецЦикла;
file.Close();

Но он, как я понимаю, к семёрке. Есть ли что-нибудь аналогичное в v8?
4 Лефмихалыч
 
24.08.09
23:59
"СоздатьОбъект" замени на "Новый COMОбъект" и станет для восьмерки
5 Лефмихалыч
 
25.08.09
00:00
а еще "file.AtEndOfStream=0" - на "НЕ file.AtEndOfStream"
6 dineso
 
25.08.09
00:03
(5) Спасибо! Вместо пятнадцати минут файл теперь проходится примерно за секунду!
7 Лефмихалыч
 
25.08.09
00:04
(6) это не я, я тут ни при чем
8 dineso
 
25.08.09
01:24
А существует ли аналогичный способ быстро очистить справочник? Сейчас 40 тысяч записей чистятся примерно 30 секунд, вот таким вот образом:

Выборка = Справочники.Книга.ВыбратьИерархически();
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
   СправочникОбъект = Выборка.ПолучитьОбъект();
   СправочникОбъект.Удалить();
КонецЦикла;    
ЗафиксироватьТранзакцию();
9 Человек на луне
 
25.08.09
01:39
Че то и так чересчур быстро.
10 dineso
 
25.08.09
01:44
(9) Получается, более быстрого способа нет? Жалко.
11 Шёпот теней
 
25.08.09
08:35
ужжж заодно, поскажите как менять кодировку при чтении файла по методу указанному в (3)+(4) ...

... вот ...
12 wise
 
25.08.09
08:46
OpenTextFile
Синтаксис:

OpenTextFile(<Filename>,<Iomode>,<Create>,<Format>)

Назначение:

Открывает текстовый файл и возвращает объект "TextStream", указывающий на него.

Параметры:

<Filename> - строка, путь к файлу.
<Iomode> - необязательный, число. Возможные значения:
1 - Открыть файл только для чтения.
2 - Открыть файл для записи. Если файл уже существовал, его содержимое теряется.
8 - Открыть файл для добавления. Если файл уже существовал, информация будет дописываться в конец файла.
<Create> - необязательный, булево (число). Создавать файл, если он не существует (True), или нет (False). По умолчанию - False.
<Format> - необязательный, число. Возможные значения:
-2 - Открыть файл в формате, используемом системой по умолчанию.
-1 - Открыть файл в формате Unicode.
0 - Открыть файл в формате ASCII (по умолчанию).


Описание:
13 Шёпот теней
 
25.08.09
08:47
(11)+ попытки писать подобное:

   file = fso.OpenTextFile(ИмяФайла, 1, 0, Кодировка);,

где

Кодировка = 1; 0; -1; -2 - ни к чему не приводят ...

... а так хочется читать в ="UTF-8" ...

... вот ..
14 Jolly Roger
 
25.08.09
08:49
(0) ЧтениеТекста ?
15 Шёпот теней
 
25.08.09
08:50
(12) пробовал и так:

   ИмяФайла = Константы.ФайлИсходник.Получить();
   fso = Новый COMОбъект ("Scripting.FileSystemObject");
   file = fso.GetFile(ИмяФайла);
   
   TextStream = file.OpenAsTextStream(1, -1);
   //file = fso.OpenTextFile(ИмяФайла, 1, , 0);
       //Пока file.AtEndOfStream=0 Цикл
           Строка = TextStream.ReadAll();
           МанипуляцииСоСтрокой(Строка);
       //КонецЦикла;
   TextStream.Close();


... всЁ хорошо только "абракадабра" ...
16 smaharbA
 
25.08.09
08:51
ADODB.Stream
17 ptiz
 
25.08.09
08:57
(14) похоже, это не модно
18 Шёпот теней
 
25.08.09
08:58
(16) ... как в анекдоте: "Ты, не умничай .. ТЫ - рукой покажи! " ...

... подскажите примером, если есть возможность ...

... вот ...
19 los_hooliganos
 
25.08.09
08:59
(8) Есть
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString  = стрSQLСтрокаСоединения;
Соединение.Open();
ТекстЗапроса = "
DELETE FROM "+ИмяТаблицыСправочника+;
Соединение.Execute(ТекстЗапроса);
Соединение.Close();
20 smaharbA
 
25.08.09
08:59
(15) но думаю в 8.х можно обойтись своим ТекстЧеготоТам...

Стрим = Новый COMОбъект ("ADODB.Stream");
Стрим.Type=2;
ИмяФайла = Константы.ФайлИсходник.Получить();
ФСО = Новый COMОбъект ("Scripting.FileSystemObject");
Файл = fso.OpenTextFile(ИмяФайла);
Пока Файл.AtEndOfStream=0 Цикл
 Стрим.Charset="windows-1251";
 Стрим.Open();
 Стрим.WriteText(Файл.ReadLine());
 Стрим.position=0;
 Стрим.Charset="utf-8";
 Строка = Стрим.ReadText();
 Стрим.Close();
 МанипуляцииСоСтрокой(Строка);
КонецЦикла;
Файл.Close();
21 Шёпот теней
 
25.08.09
09:00
типа этого: ...?

var outStreamW = new ActiveXObject("ADODB.Stream"); // Text stream in Unicode    charset
var outStreamA = new ActiveXObject("ADODB.Stream"); // Text stream in ISO-8859-1 charset
outStreamW.Type = 2;
outStreamW.Open();
22 Шёпот теней
 
25.08.09
09:02
(20) ... спАсибо ... работает ... !!!
23 dineso
 
25.08.09
11:03
(19) Это только на SQL будет работать или везде? У меня пишет ошибку:

Переменная не определена (стрSQLСтрокаСоединения)
Соединение.ConnectionString  = <<?>>стрSQLСтрокаСоединения;
24 dineso
 
26.08.09
10:24
Всё, разобрался со скоростью. Перетащил данные в регистр сведений, теперь весь регистр очищается за пару секунд.