Чтение больших текстовых файлов (CSV)
Две функции чтения CSV файла и возврата Таблицы Значений с данными файла с использованием COM объекта ADODB.Recordset и внешней компоненты GameWithFire.
- Описание
- Подробнее
Описание
Не люблю изобретать велосипед, поэтому первое что делаю при необходимости его изобрести пользуюсь поиском.
Делюсь результатом моих поисков (абсолютный копи-паст), который, думаю, поможет и другим, на форуме есть пара не закрытых веток на эту тему. А для моего случая (загрузка большого количества csv файлов в ТЗ) — лучше и не надо.
Файлы с кавычкими и вложенными запятым обрабатываются верно. Например файл с содержанием:
клиент;адрес
ИП Иванов А.А.;»Москва;ул.Ленина;53″
вернет ТЗ в 2 колонки
| клиент | адрес |
| ИП Иванов А.А. | Москва;ул.Ленина;53 |
Спасибо автору данного решения The gray Cardinal.
Публикуется с согласия автора.
Функция ПрочитатьCSV(Папка, ИмяФайла, КолПолей)
// Параметры:
// «Папка» — путь к файлу без имени файла с завершающим слешем,
// «ИмяФайла» — имя файла,
// «КолПолей» — количество колонок (число).
// Функция возвращает ТаблицуЗначений с данными файла.
Текст = «[» + ИмяФайла + «]
|ColNameHeader=False
|Format=Delimited(;)
|TextDelimiter=none
|CharacterSet=ANSI
|»;
Для ы = 1 По КолПолей Цикл
Текст = Текст + «Col» + ы + «=Field» + ы + » Text» + Символы.ПС;
КонецЦикла;
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(Текст);
ТекстДок.Записать(Папка + «Schema.ini»);
objRec = Новый COMОбъект(«ADODB.Recordset»);
strQuery = «SELECT * FROM [» + ИмяФайла + «]»;
strConn = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» + Папка + «;Extended Properties=»»text;»»»;
adOpenStatic = 3;
adLockOptimistic = 3;
adCmdText = 1;
ТаблЗнач = Новый ТаблицаЗначений;
Для ы = 1 По КолПолей Цикл
ТаблЗнач.Колонки.Добавить();
КонецЦикла;
objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
КолСтрок = objRec.RecordCount;
Ном = 1;
Пока Не objRec.EOF Цикл
Если Ном % 500 = 0 Тогда
Состояние(ИмяФайла + » » + Ном + » из » + КолСтрок);
КонецЕсли;
НовСтр = ТаблЗнач.Добавить();
Для i=0 По objRec.Fields.Count—1 Цикл
НовСтр[i] = Строка(objRec.Fields(i).Value);
КонецЦикла;
objRec.MoveNext();
Ном = Ном + 1;
КонецЦикла;
objRec.Close();
Возврат ТаблЗнач;
КонецФункции
Функция ПрочитатьCSV_2(Папка, ИмяФайла, КолПолей)
// Параметры:
// «Папка» — путь к файлу без имени файла с завершающим слешем,
// «ИмяФайла» — имя файла,
// «КолПолей» — количество колонок (число).
// Функция возвращает ТаблицуЗначений с данными файла.
Текст = «[» + ИмяФайла + «]
|ColNameHeader=False
|Format=Delimited(;)
|TextDelimiter=none
|CharacterSet=ANSI
|»;
Для ы = 1 По КолПолей Цикл
Текст = Текст + «Col» + ы + «=Field» + ы + » Text» + Символы.ПС;
КонецЦикла;
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(Текст);
ТекстДок.Записать(Папка + «Schema.ini»);
objRec = Новый COMОбъект(«ADODB.Recordset»);
strQuery = «SELECT * FROM [» + ИмяФайла + «]»;
strConn = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» + Папка + «;Extended Properties=»»text;»»»;
adOpenStatic = 3;
adLockOptimistic = 3;
adCmdText = 1;
objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
ПодключитьВнешнююКомпоненту(«GameWithFire.ADOUtils»);
ADOUtils = Новый(«AddIn.ADOUtils»);
Возврат ADOUtils.ADORecordsetToValueTable(objRec);
КонецФункции

