Чтение 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 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20128    dimanich70    81    

144

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

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

1 стартмани

18.03.2024    4091    3    John_d    11    

57

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

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

12.02.2024    18065    atdonya    24    

56

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

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

30.11.2023    5502    ke.92@mail.ru    16    

65

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

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

28.08.2023    14732    YA_418728146    7    

166

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

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

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18478    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 97 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 485 09.02.23 13:13 Сейчас в теме
(4) в CSV поля, содержащие перенос строки или разделитель, должны быть экранированы кавычками. Т.е. стандартными средствами читать такие поля тоже можно, но при чтении надо обрабатывать ситуации, когда строка считана не полностью из-за переноса строки в поле - считываем следующие строки пока не будет считана вся строка. И когда поле, содержащее разделитель "разбивается" на несколько элементов массива - проверяем наличие кавычек и "склеиваем" его обратно.
А за замеры времени - большое спасибо. Получается стандартными средствами всё таки самый быстрый метод.
7. kuzyara 2090 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 , но почему то не знаю )))) как устанавливать провайдер
Оставьте свое сообщение