Чтение csv файлов

05.07.24

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Здесь я расскажу про алгоритм чтения csv в 1С, а также про быстрое чтение csv с помощью регулярных выражений.

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

Обычно предлагается что-то вроде СтрРазделить(СтрокаCsv, ",") - тогда мы не учитываем запятые, которые являются частью значения.

Например: имеем структуру Имя,Возраст,Адрес - 3 колонки

и кортеж "Иван",25,"Город Санкт-Петербург, улица Маршала Блюхера 5 литера ""А"""

Разделив эту строку просто по запятой, получим: 

"Иван" | 25 | Город Санкт-Петербург | улица Маршала Блюхера 5 литера ""А"" - 4 значения и лишние кавычки.

Решение проблемы:

1. Последовательное чтение

Можно посимвольно читать и анализировать строку согласно правилам csv:

 
 Функция посимвольного чтения csv строки
Любая корректная csv строка будет преобразовываться в соответствующий массив значений, но на больших файлах посимвольный разбор строк будет работать довольно медленно.

Поэтому есть второй, в 3 раза более быстрый вариант.

2. Регулярные выражения

Можно выполнять ту же процедуру, используя регулярные выражения - но тогда вам потребуется версия платформы 8.23, либо виндовый сервер, позволяющий использовать COM-объект vb.

 
 Функция чтения csv строки с помощью регулярных выражений

Полноценная функция преобразования csv файла в таблицу значений выглядит примерно так:

 
Csv в таблицу значений
Функция ФайлCSVВТаблицуЗначений(АдресФайлаВХ, Разделитель = ",", ДопПараметры = Неопределено) Экспорт      
	
	ДД = ПолучитьИзВременногоХранилища(АдресФайлаВХ);
	
	Поток = ДД.ОткрытьПотокДляЧтения();
	Чтение =  Новый ЧтениеТекста(Поток);
	
	Если ЗначениеЗаполнено(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДопПараметры, "Шапка", Неопределено)) Тогда
		Шапка = ДопПараметры.Шапка;
	Иначе
		Шапка = Чтение.ПрочитатьСтроку();
	КонецЕсли;
	
	МассивКолонок = РазложитьСрокуCSVВМассивподстрок(Шапка, Разделитель);
	
	ТЗ = Новый ТаблицаЗначений;   
	
	КвСтроки = Новый КвалификаторыСтроки(999);
	КвЧисла  = Новый КвалификаторыЧисла(25, 2);
	КвДаты   = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя);
	
	ТипОбщий  = Новый ОписаниеТипов("Строка, Число, Дата, Булево", КвЧисла, КвСтроки, КвДаты);
	
	Для каждого Колонка Из МассивКолонок Цикл 
		
		Если ЗначениеЗаполнено(Колонка) Тогда  
			
			КолонкаТехИмя = СтроковыеФункцииКлиентСервер.ЗаменитьОдниСимволыДругими(""", !@#$%^&*()*-+=/\", Колонка, "");
			ТЗ.Колонки.Добавить(КолонкаТехИмя, ТипОбщий, Колонка);
			
		КонецЕсли;
		
	КонецЦикла;  
	
	
	КоличествоКолонок = ТЗ.Колонки.Количество(); 
	СчетОшибок = 0;    
	РегулярноеВыражение = РегулярноеВыражениеДляCSV(Разделитель);	
	
	ЧтениеПродолжается = Истина;
	Пока ЧтениеПродолжается Цикл     
		
		Строка = Чтение.ПрочитатьСтроку();
		
		Если Строка <> Неопределено Тогда  
			
			МассивЗначений = РазложитьСтрокуCSVВМассивПодстрок_Регулярка(Строка, РегулярноеВыражение);
			
			Если МассивЗначений.Количество() <> КоличествоКолонок Тогда
				
				СчетОшибок = СчетОшибок + 1;  
				ЗаписьЖурналаРегистрации("Не удалось разобрать csv строку!", УровеньЖурналаРегистрации.Предупреждение, ,, Строка);
				Продолжить;
				
			КонецЕсли;
			
			НовСтр = ТЗ.Добавить();
			Для НомКол = 0 По КоличествоКолонок - 1 Цикл        
				НовСтр[НомКол] = МассивЗначений[НомКол];            
			КонецЦикла;
			
		Иначе
			
			ЧтениеПродолжается = Ложь;
			Поток.Закрыть();
			
		КонецЕсли;
		
	КонецЦикла; 
	
	Возврат ТЗ;	
	
КонецФункции // ()

На этом у меня, собственно, все)

Если интересно, могу также поделиться функционалом для дальнейшей загрузки прочитанных данных в регистры или справочники.

csv csv-файл цсв преобразовать csv в ТЗ csv в таблицу значений регулярные выражения загрузка импорт быстрая загрузка csv

См. также

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    143325    821    297    

428

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.20.x), также подходят для релиза 11.5 (11.5.19.x).

35000 31500 руб.

23.07.2020    53420    236    73    

192

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.237.x) и БП 3.0 (3.0.166.x). Правила подходят для версии ПРОФ и КОРП.

35000 31500 руб.

15.12.2021    24825    174    51    

132

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    37244    99    66    

95

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    172015    307    258    

384

SALE! 10%

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    195873    155    244    

284

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    72789    184    151    

125

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в УПП 1.3 | из КА 2 в КА 1.1 | из КА 2 в УПП 1.3 | из КА 2 в УТ 10.3 | из ERP в КА 1.1 | из ERP в УТ 10.3 | из УТ 11 в УТ 10.3 | из УТ 11 в УПП 1.3 | из УТ 11 в КА 1.1 | Можно переносить только новые объекты, найденные в приемнике перезаписываться не будут | Есть фильтр по организации при выгрузке данных | Оперативно обновляем на новые релизы 1С

53111 47800 руб.

28.11.2015    83616    32    126    

66
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 839 05.07.24 15:11 Сейчас в теме
Вообще-то, для правильного CSV надо подбирать такой разделитель, который НЕ будет встречаться в ячейках. И тогда можно будет сразу прочитать весь файл в табличный документ без всяких парсеров.
Rais96; NorraSaltolinen; Cерый; +3 1 Ответить
2. comptr 35 05.07.24 18:56 Сейчас в теме
(1) Как раз в правильном CSV-файле разделителем будет запятая, ведь CSV - сокращение Comma-Separated Values :)
HansGlorias; DABadyanov; svbel85; +3 Ответить
3. aximo 2112 07.07.24 11:52 Сейчас в теме
В бсп есть готовая фунция разложить строку в массив подстрок, с любыми разделителями, группой разделителей!

Работает во всех типовых
4. webester 26 07.07.24 12:59 Сейчас в теме
(3)Я тебе больше скажу, такая функция реализована и средствами встроенного языка. То есть вшита в платформу. А в БСП судя по всему оставлена уже больше для совместимости. Но автор говорит, что медленно работает.
5. HansGlorias 26 07.07.24 17:26 Сейчас в теме
(3)
(4)

Просто разделить строку по разделителю не всегда сработает, в этом и проблема.
Бывают ситуации, когда одно из значений содержит в себе разделитель, такое значение обязательно обрамлено кавычками.
6. bayselonarrend 2295 07.07.24 22:39 Сейчас в теме
(5)Почему нельзя заменить парные кавычки на какой-нибудь символ/набор символов, который точно в природе не встречается, а затем разделить не по запятой, а по "," . После чего заменить свой набор символов на кавычки обратно
7. HansGlorias 26 07.07.24 23:42 Сейчас в теме
(6)
Не обязательно каждое значение обрамлено в кавычки.

Пример из текста: "Иван",25,"Город Санкт-Петербург, улица Маршала Блюхера 5 литера ""А""" - легитимная csv строчка, 25 без кавычек и по "," не разделится.
bayselonarrend; +1 Ответить
8. bayselonarrend 2295 07.07.24 23:49 Сейчас в теме
(7)Да, не посмотрел. Не думал, что бывают настолько замученные форматы, чтобы одна часть колонок с кавычками, а вторая - нет
9. booksfill 08.07.24 10:16 Сейчас в теме
Если я правильно понял, то мы работаем не с CSV файлом, а файлом строго определенной структуры.
Зачем нужен посимвольный обход или регулярка (кстати, тоже совсем не бесплатная) немного неясно.

Было бы любопытно сравнить производительность вот этого с тем же, но решаемом регулярками.:
res = СтрРазделить(СтрокаВовсеДажеНеCsv, ",");
res[0] - имя
res[1] - возраст
адрес = "";
разделитель = "";
Для i = 2 По res.Количество() - 1 Цикл
  адрес = адрес + разделитель + res[i];
  разделитель  = ","; 	
КонецЦикла; 
Показать


Тут идут извращения, не относящиеся к задаче, типа удаления кавычек Лучше бы их убрать, хотя уверен, что удаление открывающей и закрывающих кавычек на производительности практически не скажется.

У меня старая платформа под рукой, поэтому возможно, что com объект для разбора регулярок проиграет.
Хотелось бы посмотреть сравнение с более быстрым вариантом - с использованием средств самой платформы.
10. kuzyara 2106 09.07.24 07:29 Сейчас в теме
Решал подобную задачу - 7 правил RFC 4180

Если есть желание сравнить с существующими способами - возьмите файл payouts_details10000строк.csv, получите время чтения, сравните с нижепреведённой таблицей:
Native - 28 578 мс
ADODB - 8 336 мс
GWF - 7 236 мс

Так же попробуйте загрузить "невалидный" csv файл:
"ZF6A-11";"";""
"Прокладка выпускного коллектора металлическая";"190016010;3056046;31-024515-00;693.820;70-25112-00;71-24068-10;71-34208-00;JE138;JF206;0693820;078 253 039;103 632;103 632 015;103632685;103 633;103 633 016;1257319;256905;29-0078;302530115433;30694/1507;343412;433253115;433253115;433253115A;433253115A;460052;51157;70-24068-00;71-24068-00;AG7524;";"AUDI-PEGASO-VOLKSWAGEN-VOLVO  #  1978->  #   DV,DW,CP,1S,1G,ACT,D24,D24T,D24TIC     1595/1781/2383 cc    DIESEL"
ACDelco;OPEL Astra J/Insignia /для 17"диска;2357.00
a
a,b;c
a;b
c
"a;b";c
"a""b";c
"""";c
";";c
;
a;"b
c";d
a;"b
c;

d;;
e";d
a;"b""
c""";d
a;"b
"с"
a;""b;";"
aaa;"";"ccc"
Показать
ведь входящие данные далеко не всегда идеалены)
HansGlorias; +1 Ответить
11. kuzyara 2106 09.07.24 08:02 Сейчас в теме
(10) Сравнил со своей нативной реализацией - у вас без многострочных полей и в 2 раза быстрее)
HansGlorias; +1 Ответить
Оставьте свое сообщение