Чтение 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С v8.3 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    3749    DeerCven    9    

48

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

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    42100    dimanich70    83    

158

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

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

1 стартмани

18.03.2024    6191    6    John_d    11    

58

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

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

12.02.2024    51042    atdonya    30    

66

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

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

30.11.2023    7960    ke.92@mail.ru    17    

66

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

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

28.08.2023    21349    YA_418728146    8    

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

Но учтите, что стандартными средствами через СтрРазделить() поля не могут быть многострочными или содержать символ разделителя
sheverdin; triviumfan; +2 Ответить
6. de0nis 550 09.02.23 13:13 Сейчас в теме
(4) в CSV поля, содержащие перенос строки или разделитель, должны быть экранированы кавычками. Т.е. стандартными средствами читать такие поля тоже можно, но при чтении надо обрабатывать ситуации, когда строка считана не полностью из-за переноса строки в поле - считываем следующие строки пока не будет считана вся строка. И когда поле, содержащее разделитель "разбивается" на несколько элементов массива - проверяем наличие кавычек и "склеиваем" его обратно.
А за замеры времени - большое спасибо. Получается стандартными средствами всё таки самый быстрый метод.
7. kuzyara 2194 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 37 12.09.22 16:55 Сейчас в теме
Для чтения многострочных CSV придумал свое решение: CSV. Чтение многострочных полей с экранированными символами
Хотел бы сравнить скорость чтения через ADo , но почему то не знаю )))) как устанавливать провайдер
Для отправки сообщения требуется регистрация/авторизация