Чтение CSV (быстрое)

09.02.23

Разработка - Универсальные функции

Почему то из гугла до сих пор нет ссылки на код процедуры быстро читающей csv... Загрузка из файла CSV c помощью ADODB.Connection провайдера Microsoft.Jet.OLEDB.

По мотивам...

Чтение данных csv файла с помощью ADODB.Connection

&НаСервереБезКонтекста
Функция ПрочитатьCSVвТЗ_ADO(ИмяФайла, Разделитель=";", ЗаголовкиИзПервойСтроки = Ложь)
	ТаблицаРезультат = Новый ТаблицаЗначений;
	ФайлДанных = Новый Файл(ИмяФайла);
	
	Connection=Новый COMОбъект("ADODB.Connection");
	Connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ФайлДанных.Путь+";Extended Properties=""text;HDR=No;IMEX=1;FMT=Delimited""");

	// Так как FMT=Delimited(;) не работает создадим schema.ini 
	Схема = "[" + ФайлДанных.Имя+ "]
		|ColNameHeader=False
		|Format=Delimited("+Разделитель+")
		|CharacterSet=ANSI
    	|";

	Если Разделитель = "," Тогда
		Схема = "[" + ФайлДанных.Имя+ "]";
	КонецЕсли;
	
	ФайлСхемы = Новый Файл(ФайлДанных.Путь+"Schema.ini");
	
	ЗаписьТекста = Новый ЗаписьТекста(ФайлСхемы.ПолноеИмя, КодировкаТекста.ANSI);
	ЗаписьТекста.Записать(Схема);
	ЗаписьТекста.Закрыть();
	
	RecordSet=Новый COMОбъект("ADODB.Recordset");
	RecordSet.ActiveConnection = Connection;
	
	RecordSet.Open("select * from "+ФайлДанных.Имя, Connection);
	
	// определим имена колонок
	Для НомерКолонки = 0 по RecordSet.Fields.Count-1 Цикл
		ТаблицаРезультат.Колонки.Добавить(RecordSet.Fields(НомерКолонки).Name);
	КонецЦикла;
	
	Сч=0;
	Пока НЕ RecordSet.EOF() Цикл
		Сч=Сч+1;
		
		НоваяСтрока = ТаблицаРезультат.Добавить();
		Для й=0 по RecordSet.Fields.Count-1 Цикл
			НоваяСтрока[й] = RecordSet.Fields(й).Value;
		КонецЦикла;
		
		RecordSet.MoveNext();
	КонецЦикла;
	
	RecordSet.Close();
	Connection.Close();
	Возврат ТаблицаРезультат;
КонецФункции
 
  Вариант на Microsoft Text Driver (*.txt; *.csv)
 
 Чтение файла CSV стандартными средствами

Для больших файлов нужно использовать Microsoft.Jet.OLEDB, а не построчное чтение средствами платформы. Понимает даты, числа и многострочные поля. Скорость: ~3000 строк в секунду. 

На msdn можно найти описание грамматики и Schema.ini.

Из минусов - нужны права на запись файла схемы в каталог с csv-файлом...

Почему нельзя определить разделитель в строке подключения FMT=Delimited(;) описано здесь: https://stackoverflow.com/questions/51949360/adodb-connection-delimiter-semicolon-does-not-work-for-csv-text-files

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2680    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4614    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3965    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8845    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16152    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 93 05.04.21 09:42 Сейчас в теме
Не хватает сравнения производительности стандартными средствами vs адо.
4. user1455510 14.04.21 11:20 Сейчас в теме
(1) Время чтения через ADO: 4 040 мс, время чтения через ADO(без схемы): 3 862 мс, время чтения стандартными средствами: 1 802 мс

Но учтите, что стандартными средствами через СтрРазделить() поля не могут быть многострочными или содержать символ разделителя
user934971; triviumfan; +2 Ответить
6. de0nis 444 09.02.23 13:13 Сейчас в теме
(4) в CSV поля, содержащие перенос строки или разделитель, должны быть экранированы кавычками. Т.е. стандартными средствами читать такие поля тоже можно, но при чтении надо обрабатывать ситуации, когда строка считана не полностью из-за переноса строки в поле - считываем следующие строки пока не будет считана вся строка. И когда поле, содержащее разделитель "разбивается" на несколько элементов массива - проверяем наличие кавычек и "склеиваем" его обратно.
А за замеры времени - большое спасибо. Получается стандартными средствами всё таки самый быстрый метод.
7. kuzyara 1902 09.02.23 17:20 Сейчас в теме
(6) посмотрите мою предыдущую статью 7 правил RFC 4180

под фразой "время чтения стандартными средствами: 1 802 мс" здесь имеется ввиду чтение по правилам 1-2-3-4.

Если же как вы говорите
при чтении надо обрабатывать ситуации когда поля, содержащие перенос строки или разделитель, должны быть экранированы кавычками

то это уже правила 5,6 и 7, и время чтения там кратно выше.

Cравнение способов чтения средствами 1С:
- линейное по правилам 1,2,3,4 читает со скоростью - 10 000 строк / 1 сек
- автомат по правилам 1-7 (вариант KAV2) - 1000 строк / 1 сек
- эвристика Arxxximed по правилам 1-7 - 2300 строк / 1 сек

Я же предлагаю использовать внешние компоненты:
- ADO читает со скоростью 6300 строк в секунду
- GWF читает со скоростью 10000 строк в секунду

так как в них уже реализована поддержка всех 7 правил rfc 4180.

Код здесь: https://github.com/kuzyara/ConvertCSV/blob/master/СравнениеСпособовЧтенияCS­VФайлов.bsl
kraynev-navi; de0nis; +2 Ответить
2. user1430978 06.04.21 08:51 Сейчас в теме
А где в коде используется файл схемы и какие правила к строке шаблона ?
3. user1455510 14.04.21 10:50 Сейчас в теме
(2) Файл Schema.ini file необходим, чтобы драйвер правильно интерпретировал содержимое текстовых файлов.

Schema.ini File (Text File Driver)

When the Text driver is used, the format of the text file is determined by using a schema information file. The schema information file is always named Schema.ini and always kept in the same directory as the text data source. The schema information file provides the IISAM with information about the general format of the file, the column name and data type information, and several other data characteristics. A Schema.ini file is always required for accessing fixed-length data. You should use a Schema.ini file when your text table contains DateTime, Currency, or Decimal data, or any time that you want more control over the handling of the data in the table.


Пример Schema.ini для apache_access.csv:

[apache_access.csv]
Format=TabDelimited
ColNameHeader=false
CharacterSet=ANSI
Col1=IPAddress char width 15
Col2=AccessTime date
Col3=Request char width 250
Col4=Code Integer

Как только файл Schema.ini сохранён в папке, Microsoft Text драйвер может работать с файлами.

https://nhutils.ru/blog/tekstovye-fayly-v-microsoft-text-driver/
5. Arxxximed 34 12.09.22 16:55 Сейчас в теме
Для чтения многострочных CSV придумал свое решение: CSV. Чтение многострочных полей с экранированными символами
Хотел бы сравнить скорость чтения через ADo , но почему то не знаю )))) как устанавливать провайдер
Оставьте свое сообщение