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




А если внутри поля есть текст с точкой-запятой в кавычках, нормально прочитает?
Например, файл
клиент;адрес
ИП Иванов А.А.;»Москва;ул.Ленина;53″
прочитается верно, как 2 поля?
а как серый кардинал к этому относится, что вы скоммуниздили его функции? …я помнится еще весной видел эти ф-ции…
(2) cool.vlad4, чукча не читатель…
описание прочти и/или опубликуй что-ть, что пройдет модерацию, потом поговорим.
(1) artbear, на днях специально проверю, в моем случае такого набора данных быть не может
(3) Реагируй адекватно. Написано же
вот я и спросил, а The Gray Cardinal дал добро или нет. …на этом сайте он помоему зарегистрирован.
ЗЫ
и? где в описании есть его разрешение? ф-ции один в один скопированы, есть чем гордится…
(5) cool.vlad4, Публикуется с согласия автора.
Перед тем как пост будет опубликован он проходит модерацию, где админ задает такой же вопрос и получает ответ.
Реагируй адекватно
Не считай других хуже себя, эталона нравственности.
(6) Я и не считаю, я просто задал вопрос, поскольку есть такая возможность и поскольку бываю на форуме скрипт-кодинга. Ты слишком нервно все воспринимаешь
Зы и почему-то у меня в браузере не было надписи, что публикуется с согласия. Приношу свои извинения.
(7) cool.vlad4, ок!
(1) Обе ф-ции грузят как положено. Проверил,
ЗЫ Только клиент и адрес_ уйдут под название колонок
ЗЫ Только клиент и адрес_ уйдут под название колонок
ИМХО, так и задумано, для универсальности.
Спасибо, что проверил!
(9) Спасибо.
(10) да, это верное поведение.
Рекомендую добавить в описание небольшой коммент насчет кавычек и вложенных точек с запятой, т.к. такие тексты не такая уж редкость 🙁
(12) что за консоль?
Плагиат и есть плагиат, куда смотрят модераторы!!!
(14) svetlanapk, где плагиат?
См. выше support
(16) Administrator, так вроде получено разрешение. Хотелось бы конечно, чтобы сам подтвердил.
(15) support,
(all) думаю, ники svetlanapk, Administrator это клоны пользователя infoooo, который очень любит использовать чужие (и мою, в том числе) обработки в своих сборках, что было неоднократно доказано (ссылку не даю, она забанена).
Думаю администрации нужно повнимательнее отнестись к клонам и накруткам на этом сайте.
(16) Administrator, а ты чтобы не палисться перелогиниться не забывай.
Народ, а у меня несмотря на файл schema.ini всё равно читает, как будто разделитель — запятые (((( Помогите!!! Что делать?
[Cписок2.txt]
ColNameHeader=True
Format=Delimited(;)
TextDelimiter=none
CharacterSet=ANSI
Col1=Field1 Text
Col2=Field2 Text
Col3=Field3 Text
Col4=Field4 Text
Col5=Field5 Text
Col6=Field6 Text
PS: если кто скажет переименуй в csv — неповерю, проверял. Также смотрел остальные параметры schema.ini — не помогло (((
(20) В коде есть небольшая неточность. Из-за того, что по-умолчанию метод «Записать» объекта «ТекстовыйДокумент» сохраняет в кодировке UTF8 (см. синтакс-помощник), в файле Schema.ini в начале появляются лишние символы, которые обычно не видны в просмотрщике. И кажется, что с файлом все в порядке.
На самом деле строчка
ТекстДок.Записать(Папка + «Schema.ini»);
должна выглядеть так:
ТекстДок.Записать(Папка + «Schema.ini», КодировкаТекста.ANSI);
Так все работает.
Для работы с ADO использую
Прочитал про GameWithFire.dll и обрадовался, щас ускорю выгрузку ADORecordset в ТЗ.
Но обнаружилось, что на сервере (где мне это особенно интересно сделать)
подключить ВК невозможно (ограничение платформы как под 8.1, так и под 8.2, у меня — 8.1).
Не знаете, как можно обойти это ограничение ???
оооо спасибо, искал, кажется то что надо
(21) zfilin, Благодарю за подсказку
ТекстДок.Записать(Папка + «Schema.ini», КодировкаТекста.ANSI);
так действительно лучше выглядит.
Что-то у меня не читает файл. Коллекция с пустыми ячейками.
Но у меня разделитель «,».
Не помогло.
Похоже проблема в том что файл содержит для каждой колонки обертку «». Так еще в самих ячейках есть разделитель. Придется писать свой парсер.
а как на счет больших файлов, у которых больше 255 колонок?
кто-то сталкивался с данной проблемой?
(27) yur4ik9408, у моего парсера количество колонок роли не играет, вопрос только в стандарте и размере самого файла.
(28) Xershi, А где можно посмотреть на ваш парсер?
(29) yur4ik9408, в моих публикациях.
Для небольших файлов можно использовать такой .
3 часа потратил на отладку — еле нашел ошибку.
Строчка
в моем случае записывала в UTF-8 с BOM и драйвер ни в какую не хотел есть файл Schema.ini
Все решается просто заменой строки на
Не надо меня благодарить
(32) ещё в (21) комменте 5 лет назад было написано 🙂