Имя: Пароль:
1C
1С v8
Загрузка из текстового файла
,
0 palpetrovich
 
06.11.12
15:21
Существует что-то для 8.* быстрее чем:
   Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
?
зы: Если "Да", то как?
1 Happy Bear
 
06.11.12
15:23
(0) у тебя гигабайты текста?
2 rutony
 
06.11.12
15:24
(0) А вот так не быстрее?

ВсегоСтрок = Текст.КоличествоСтрок();
Для НомерСтроки = 1 По ВсегоСтрок Цикл
3 palpetrovich
 
06.11.12
15:24
(1) десятки мб, вроде и не много, сек 15 грузится, но заметно
4 palpetrovich
 
06.11.12
15:24
(2) вряд-ли заметно
5 rutony
 
06.11.12
15:31
(4) Разница в том, что бы на каждом ветке цикла не считать количество строк...

А так тут оптимизировать нечего, ищи другие тонкие места...

Есть варианты с чтением нескольких строк сразу, но это минимальный прирост больше возни...
6 palpetrovich
 
06.11.12
18:08
инет глючит целый день... вот нарыл, еще не проверял
7 palpetrovich
 
06.11.12
18:09
Функция ПрочитатьCSV(Папка, ИмяФайла, КолПолей)
   // Параметры:
   // "Папка" - путь к файлу без имени файла с завершающим слешем,
   // "ИмяФайла" - имя файла,
   // "КолПолей" - количество колонок (число).
   // Функция возвращает ТаблицуЗначений с данными файла.
   
   Текст = "[" + ИмяФайла + "]
   |ColNameHeader=False
   |Format=Delimited(;)
   |TextDelimiter=none
   |CharacterSet=ANSI
   |";
   Для ы = 1 По КолПолей Цикл
       Текст = Текст + "Col" + ы + "=Field" + ы + " Text" + Символы.ПС;
   КонецЦикла;
   ТекстДок = Новый ТекстовыйДокумент;
   ТекстДок.УстановитьТекст(Текст);
   ТекстДок.Записать(Папка + "Schema.ini");
   
   objRec = Новый COMОбъект("ADODB.Recordset");
   strQuery = "SELECT * FROM [" + ИмяФайла + "]";
   strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Папка + ";Extended Properties=""text;""";
   adOpenStatic = 3;
   adLockOptimistic = 3;
   adCmdText = 1;
   ТаблЗнач = Новый ТаблицаЗначений;
   Для ы = 1 По КолПолей Цикл
       ТаблЗнач.Колонки.Добавить();
   КонецЦикла;
   
   objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
   КолСтрок = objRec.RecordCount;
   Ном = 1;
   Пока Не objRec.EOF Цикл
       Если Ном % 500 = 0 Тогда
           Состояние(ИмяФайла + " " + Ном + " из " + КолСтрок);
       КонецЕсли;
       НовСтр = ТаблЗнач.Добавить();
       Для i=0 По objRec.Fields.Count-1 Цикл
           НовСтр[i] = Строка(objRec.Fields(i).Value);
       КонецЦикла;
       objRec.MoveNext();
       Ном = Ном + 1;
   КонецЦикла;
   objRec.Close();
   Возврат ТаблЗнач;
КонецФункции
8 Wobland
 
06.11.12
18:09
(2) нет. вычисляется один раз. я проверял - менял внутри цикла
9 Reset
 
06.11.12
18:11
Возможно, будет быстрее через ЧтениеТекста, а не ТекстовыйДокумент
10 Wobland
 
06.11.12
18:11
Н=4;
Для й=1 По Н Цикл
   Н=1;
   Сообщить(й);
КонецЦикла;
====
1
2
3
4
11 Wobland
 
06.11.12
18:12
(7) это что сейчас было? запрос к цсв? серьёзно?
12 Живой Ископаемый
 
06.11.12
18:13
(7) и как, быстрее?
13 Живой Ископаемый
 
06.11.12
18:15
в конце концов, если нужно быстро - определи Внешний Источник Данных к CSV. Будет без ОЛЕДБ, только через ОДБС, возможно будет быстрее.
14 palpetrovich
 
07.11.12
12:00
(11) серьёзно, работает  :) правда, прироста скорости в сравнении с (0) я не обнаружил :)
15 Wobland
 
07.11.12
12:00
(14) у меня разрыв шаблона. запрос к текстовому файлу. я себе это обязательно запишу, спасибо
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший