Не люблю изобретать велосипед, поэтому первое что делаю при необходимости его изобрести пользуюсь поиском.
Делюсь результатом моих поисков (абсолютный копи-паст), который, думаю, поможет и другим, на форуме есть пара не закрытых веток на эту тему. А для моего случая (загрузка большого количества 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);
КонецФункции