#0
by Smallrat
Есть вот такой CSV, в котором встречаются такие штуки: разделитель в поле и перевод строки (LF) в поле. Excel умудряется такой файл корректно прочитать. Чем его можно загрузить в таблицу значений ? Файл довольно большой - 140000 строк. пробовал через ADODB: несмотря на то что заявлено что "Файлы с кавычкими и вложенными запятым обрабатываются верно" - у меня поле с разделителем раскидывает в два поля, ну и перевод строки считает за новую строку. Мучался, мучался - так и не получилось изменить поведение. Мутить чтение через excel? долго наверное будет, да и муторно. Может есть у кого работающий код?
#1
by NWsFF
Код не сохранился, делал это на регулярных выражениях, вся соль в самом регулярном выражении, правда у меня перевода строки не было в полях, так что копай в строну регулярок.
#5
by Smallrat
регулярки... не доводилось щупать, но попробую если не найду способа попроще думаю долго будет, сперва он будет в эксель грузится, потом его оттуда читать построчно. хотя он сразу читает всё верно. щас зачту
#6
by Smallrat
не отлавливает чтото разделитель и LF в поле ( попробую этот код из книги если не взлетит - приедтся наверное браться за регулярки
#7
by Serginio1
А как пишешь? ExtractFields(S,aList,Delimiter,QuoteChar) ? Ты должен подать на вход строку S, массив aList. Функция заполнит массив
#8
by Smallrat
мда, невнимательно скопипастил. Теперь разделитель правильно находит и колнки делит правильно. А вот с переводом строки выдает ошибку "Нет закрывающей скобки" (
#10
by Serginio1
Ты должен подать на вход строку без перевода строки. Обычно это делается через чтение файла.
#12
by Smallrat
что-то у меня не распознает конец строки (( Стр = ЧтениеТекста.ПрочитатьСтроку(Символы.ВК+Символы.ПС); считывает весь оставшийся текст. ,а Стр = ЧтениеТекста.ПрочитатьСтроку; разбивает строку с LF (он же Символы.ПС) на несколько
#14
by Smallrat
не - разделитель колонок точка с запятой - ";" сама колонка порой представляет многострочный текст - внутри строки разделяются LF, в то время как строки таблицы отделяются CR+LF вот и я не могу заставить ЧтениеТекста разделять строки друг от друга по CR+LF
#15
by Serginio1
Можно попробовать двумя способами справится Либо СтрЗаменить(ИсходныйТекст,Символ.ПС,"") или Сейчас алгоритм посмотрю
#17
by Smallrat
щас попробую у меня не получается ее получить - либо он ее обрезает по LF, либо в строке весь текст файла.
#18
by Serginio1
А у тебя точно разделитель CR+LF? Я обчно в таких ситуация в Попытке исключение ловлю исключение и склеиваю строки
#21
by Serginio1
Тип: Строка. Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. Значение по умолчанию: ВК + ПС. Разделитель задается в КонвертируемыйРазделительСтрок А разделитель строк ПС. Можно Ради интереса попробовать Новый ЧтениеТекста(ИмяФайла, Кодировка,Символы.ВК, Символы.ВК+Символы.ПС, <МонопольныйРежим>) Просто получается внутри переводом строки уже является ПС. Вообще замутили они с этими переносами. Без пол литра не обойтись.
#22
by Smallrat
>>Без пол литра не обойтись. это еще упрощенный пример. сам файл настолько долбанутый, что у меня чуть руки не опустились. ладно бы один раз надо было грузануть - я бы его поконвертировал в чтото удобное, а надо постоянную загрузку написать. вот шапка так вылядит ;Прайс-лист;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;В валютах цен.;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Цены указаны на 22.05.2013;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Ценовая группа/ Номенклатура/ Характеристика номенклатуры;Номенклатура.Код;Номенклатура.Артикул;Номенклатура.Наименование;Номенклатура.Полное наименование;Номенклатура.Группа;Номенклатура.Бренд;Номенклатура.Группа.Код;Номенклатура.Группа.Группа;Номенклатура.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа.Группа.Код;Номенклатура.Единица хранения остатков;Номенклатура.Единица хранения остатков.Объем;Номенклатура.Количество в упаковке;Номенклатура.Количество на паллете;Номенклатура.Единица хранения остатков.Длина;Номенклатура.Единица хранения остатков.Высота;Номенклатура.Единица хранения остатков.Ширина;Розничная; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;Цена;Ед. причем в "описании" структуры количество колонок из-за какой-то ошибки меньше чем в структуре, в конце должно быть Розничная Цена;Ед. я аж прифигел когда такой "csv" увидел
#23
by Kreont
CSV - файл не правильный, сделай без переносов и все пойдет. CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы.
#25
by Kreont
ну я например пишу импорт, только из правильных CSV, а если какойто прогер, тот что например мне хочеть втулить "свой" вариант реализации CSV идет или лесом, или сам меняет свою программу. Без вариантов. А ложиться под чужие кривые форматы просто глупо.
#26
by Kreont
вики правят добровольцы, как видишь неудачно, тут уж ничего не поделаешь Ищи оригинал RFC, для стандарта CSV, его и покажи автору твоего CSV, пусть правит.
#27
by Kreont
и самое главное: 1. Each record is located on a separate line, delimited by a line break (CRLF)
#28
by Smallrat
задача пока поставлена грузить из чего есть - и прогера там нет, это похоже на какую-ту стандартную конвертацию отчета "прайс-лист" из УТ, ее манагеры делают и ничео другого, окромя mxl прислать не могут.
#29
by Smallrat
6. Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. For example: "aaa","b CRLF у меня правда не CRLF а просто LF
#30
by Kreont
прикольно, я так далеко не читал ))), ну дай им рфс без 6-го пункта :) Значит не повезло тебе с файлом, уменя такие ниразу не попадались, придется писать.
#32
by Smallrat
Примерно так: [222.csv] ColNameHeader=False Format=Delimited(;) TextDelimiter=none CharacterSet=ANSI
#34
by Smallrat
как бы этот перевод строки отличить от возврата каретки. чтото у меня пока не получается.
#37
by Smallrat
ну в принципе можно - эт получается что сначала надо весь 50мегабайтный файл считать, заменить символы, записать, а потом снова распарсить уже как нормальный csv. янадо по времени замерить
#40
by Smallrat
Внезапно получилось так: ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI,Символы.ВК, Символы.ПС - тут может быть любой символ кроме Символы.ВК); правда каждая строка, получаемая из файла теперь впереди с переводом каретки (или строки, я пока не понял), но СокрЛ это правит то есть первая строка считывается как: а вторая как
#42
by Smallrat
а нет - как раз так у меня не получилось Новый ЧтениеТекста(ИмяФайла, Кодировка,Символы.ВК, Символы.ВК+Символы.ПС, <МонопольныйРежим>) вместо Символы.ВК+Символы.ПС надо любое другое указать но без Символы.ВК
#46
by Serginio1
То есть что получается при Новый ЧтениеТекста(ИмяФайла, Кодировка,Символы.ВК) Там по умлчанию Символы.ВК+Символы.ПС При указании Символы.ПС она отработывает только Символы.ПС. То есть если символ идет сначала строки то у тебя Символы.ПС+Символы.ВК
#50
by Smallrat
ага. правда я вот понимаю что разделить получилось только потому что у меня перенос идет только одним символом LF, в то время как по RFC двумя и все задается только кавычками -типа так весь файл в одну строку сваливается
#57
by Serginio1
56 + но при этом часто бывает, что файла не всегда корректные и приходится их дорабатывать своими парсерами
#58
by Smallrat
посимвольное чтение ? это ж я поседею в процессе. бинго! ну еклмн, как все просто.... вроде бы 40 мегабайт csv загрузились корректно, на первый взгляд, щас напишу обработку таблицы и там видно будет. Всем большое спасибо! не оставили в беде )))
#59
by Eugeneer
вот готовое - гарантируем работу Читайет эксель и CSV напрямую - своя суперкомпонента. Скорость считывания 100 000 за 1 минуту.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Нумерация строк в запросе
- Получить макет во внешнем отчете СКД при компоновке данных
- Подсчет суммы комплектующих УТ11
- Можно ли в экселе подсветить строку/ячейку при поиске по ctrl-f ?
- Проблема с загрузкой файла с банк-клиента "Сбербанк" в УТ 11.1
- v7: Как получить дату приема у уволенного сотрудника в ЗИК 1с77?
- Как добавить реквизит на управляемую форму во внешней обработки?
- Вылетает 1ска при выполнении Recordset.Open
- УТ 11 не проводится документ "поступление товаров и услуг"
- УНФ как вручную изменить номер расходной накладной?
- Отчет по затратам на выпуск (УПП)
- Универсальный отчет - дочернее поле
- v7: Обработка результатов запроса из 1с 77 к 1с 82 через OLE соединение
- ошибка при импорте данных
- Перенос оборотов из 7.7 в 8.2
- БГУ - сумма в журнале операций не совпадает с главной книгой
- реализация товаров на основании поступления товаров
- Ошибка при вызове web-сервиса 1C 8.3 (Внутренняя ошибка. Ошибка инициализации б)
- Как сделать поле ввода прозрачным???
- 1С Розница. Перемещение между магазинами.