Чтение 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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3571    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6614    DeerCven    15    

57

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

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

21.05.2024    49415    dimanich70    83    

170

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

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

1 стартмани

18.03.2024    7378    6    John_d    13    

59

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

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

12.02.2024    61944    atdonya    31    

70

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

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

30.11.2023    9195    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 573 09.02.23 13:13 Сейчас в теме
(4) в CSV поля, содержащие перенос строки или разделитель, должны быть экранированы кавычками. Т.е. стандартными средствами читать такие поля тоже можно, но при чтении надо обрабатывать ситуации, когда строка считана не полностью из-за переноса строки в поле - считываем следующие строки пока не будет считана вся строка. И когда поле, содержащее разделитель "разбивается" на несколько элементов массива - проверяем наличие кавычек и "склеиваем" его обратно.
А за замеры времени - большое спасибо. Получается стандартными средствами всё таки самый быстрый метод.
7. kuzyara 2223 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 38 12.09.22 16:55 Сейчас в теме
Для чтения многострочных CSV придумал свое решение: CSV. Чтение многострочных полей с экранированными символами
Хотел бы сравнить скорость чтения через ADo , но почему то не знаю )))) как устанавливать провайдер
Для отправки сообщения требуется регистрация/авторизация