Чем загрузить "сложный" CSV ? #667239


#0 by Smallrat
Есть вот такой CSV, в котором встречаются такие штуки: разделитель в поле и перевод строки (LF) в поле. Excel умудряется такой файл корректно  прочитать. Чем его можно загрузить в таблицу значений ? Файл довольно большой - 140000 строк. пробовал через ADODB: несмотря на то что заявлено что "Файлы с кавычкими и вложенными запятым обрабатываются верно" - у меня поле с разделителем раскидывает в два поля, ну и перевод строки считает за новую строку. Мучался, мучался - так и не получилось изменить поведение. Мутить чтение через excel? долго наверное будет, да и муторно. Может есть у кого работающий код?
#1 by NWsFF
Код не сохранился, делал это на регулярных выражениях, вся соль в самом регулярном выражении, правда у меня перевода строки не было в полях, так что копай в строну регулярок.
#2 by zladenuw
а если конвертнуть его в ексель. а дальше читать через адо ?
#3 by Serginio1
См Есть переписанный вариант
#4 by Serginio1
#5 by Smallrat
регулярки... не доводилось щупать, но попробую если не найду способа попроще думаю долго будет, сперва он будет в эксель грузится, потом его оттуда читать построчно. хотя он сразу читает всё верно. щас зачту
#6 by Smallrat
не отлавливает чтото разделитель и LF в поле ( попробую этот код из книги если не взлетит - приедтся наверное браться за регулярки
#7 by Serginio1
А как пишешь? ExtractFields(S,aList,Delimiter,QuoteChar) ? Ты должен подать на вход строку S, массив aList. Функция заполнит массив
#8 by Smallrat
мда, невнимательно скопипастил. Теперь разделитель правильно находит и колнки делит правильно. А вот с переводом строки выдает ошибку "Нет закрывающей скобки" (
#9 by Smallrat
щас или вечером попробую допилить
#10 by Serginio1
Ты должен подать на вход строку без перевода строки. Обычно это делается через чтение файла.
#11 by Serginio1
#12 by Smallrat
что-то у меня не распознает конец строки (( Стр = ЧтениеТекста.ПрочитатьСтроку(Символы.ВК+Символы.ПС); считывает весь оставшийся текст. ,а Стр = ЧтениеТекста.ПрочитатьСтроку; разбивает строку с LF (он же Символы.ПС) на несколько
#13 by Serginio1
То есть у тебя LF это разделитель колонок?
#14 by Smallrat
не - разделитель колонок точка с запятой - ";" сама колонка порой представляет многострочный текст - внутри строки разделяются LF, в то время как строки таблицы отделяются CR+LF вот и я не могу заставить ЧтениеТекста разделять строки друг от друга по CR+LF
#15 by Serginio1
Можно попробовать двумя способами справится Либо СтрЗаменить(ИсходныйТекст,Символ.ПС,"") или Сейчас алгоритм посмотрю
#16 by Serginio1
Что выдает СтрДлина(S) для строки содержащей LF?
#17 by Smallrat
щас попробую у меня не получается ее получить - либо он ее обрезает по LF, либо в строке весь текст файла.
#18 by Serginio1
А у тебя точно разделитель  CR+LF? Я обчно в таких ситуация в Попытке исключение ловлю исключение и склеиваю строки
#19 by Smallrat
не успел на работе, буду дома пробовать
#20 by Smallrat
вот примерно так выглядит
#21 by Serginio1
Тип: Строка. Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. Значение по умолчанию: ВК + ПС. Разделитель задается в КонвертируемыйРазделительСтрок А разделитель строк ПС. Можно Ради интереса попробовать Новый ЧтениеТекста(ИмяФайла, Кодировка,Символы.ВК, Символы.ВК+Символы.ПС, <МонопольныйРежим>) Просто получается внутри переводом строки уже является ПС. Вообще замутили они с этими переносами. Без пол литра не обойтись.
#22 by Smallrat
>>Без пол литра не обойтись. это еще упрощенный пример. сам файл настолько долбанутый, что у меня чуть руки не опустились. ладно бы один раз надо было грузануть - я бы его поконвертировал в чтото удобное, а надо постоянную загрузку написать. вот шапка так вылядит ;Прайс-лист;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;В валютах цен.;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Цены указаны на 22.05.2013;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Ценовая группа/ Номенклатура/ Характеристика номенклатуры;Номенклатура.Код;Номенклатура.Артикул;Номенклатура.Наименование;Номенклатура.Полное наименование;Номенклатура.Группа;Номенклатура.Бренд;Номенклатура.Группа.Код;Номенклатура.Группа.Группа;Номенклатура.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа.Код;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа.Группа;Номенклатура.Группа.Группа.Группа.Группа.Группа.Группа.Группа.Код;Номенклатура.Единица хранения остатков;Номенклатура.Единица хранения остатков.Объем;Номенклатура.Количество в упаковке;Номенклатура.Количество на паллете;Номенклатура.Единица хранения остатков.Длина;Номенклатура.Единица хранения остатков.Высота;Номенклатура.Единица хранения остатков.Ширина;Розничная; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;Цена;Ед. причем в "описании" структуры количество колонок из-за какой-то ошибки меньше чем в структуре, в конце должно быть Розничная Цена;Ед. я аж прифигел когда такой "csv" увидел
#23 by Kreont
CSV - файл не правильный, сделай без переносов и все пойдет. CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы.
#24 by Smallrat
в самой вики кстати в первом же примере csv с переносами и запятыми в полях.
#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-го пункта :) Значит не повезло тебе с файлом, уменя такие ниразу не попадались, придется писать.
#31 by Jaap Vduul
>> пробовал через ADODB Покажь свой schema.ini
#32 by Smallrat
Примерно так: [222.csv] ColNameHeader=False Format=Delimited(;) TextDelimiter=none CharacterSet=ANSI
#33 by Ковычки
заменить перевод строки на пробел
#34 by Smallrat
как бы этот перевод строки отличить от возврата каретки. чтото у меня пока не получается.
#35 by Ковычки
СтрЗаменить(СтрЗаменить(Стр,Символы.ПС," "),Символы.ВК,Символы.ВК+Символы.ПС);
#36 by Ковычки
хотя х.з. как это в объекте текст
#37 by Smallrat
ну в принципе можно - эт получается что сначала надо весь 50мегабайтный файл считать, заменить символы, записать, а потом снова распарсить уже как нормальный csv. янадо по времени замерить
#38 by Smallrat
в чтении текста пока не получается (
#39 by Ковычки
#40 by Smallrat
Внезапно получилось так: ЧтениеТекста  = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI,Символы.ВК, Символы.ПС - тут может быть любой символ кроме Символы.ВК); правда каждая строка, получаемая из файла теперь впереди с переводом каретки (или строки, я пока не понял), но СокрЛ это правит то есть первая строка считывается как: а вторая как
#41 by Smallrat
млииин - все же в написано, вот я балда
#42 by Smallrat
а нет - как раз так у меня не получилось Новый ЧтениеТекста(ИмяФайла, Кодировка,Символы.ВК, Символы.ВК+Символы.ПС, <МонопольныйРежим>) вместо Символы.ВК+Символы.ПС надо любое другое указать но без Символы.ВК
#43 by Serginio1
Чесно говоя я такие файлы на C# обработываю
#44 by Serginio1
А если ничего не указываь?
#45 by Ковычки
балда ты, давай файл
#46 by Serginio1
То есть что получается при Новый ЧтениеТекста(ИмяФайла, Кодировка,Символы.ВК) Там по умлчанию  Символы.ВК+Символы.ПС При указании Символы.ПС она отработывает только Символы.ПС. То есть если символ идет сначала строки то у тебя Символы.ПС+Символы.ВК
#47 by Smallrat
#48 by Serginio1
нет спереди у тебя стоит как раз Символы.ПС
#49 by Serginio1
А что делается если указать Символы.ВК+Символы.ПС
#50 by Smallrat
ага. правда я вот понимаю что разделить получилось только потому что у меня перенос идет только одним символом LF, в то время как по RFC двумя и все  задается только кавычками   -типа так весь файл в одну строку сваливается
#51 by Ковычки
#52 by Smallrat
вот так получилось клиент;адрес  "ИП Ив анов А.А.";"Москва;ул.Ленина;53"
#53 by Serginio1
Ну до к этому и здесь пришли
#54 by Ковычки
#55 by Jaap Vduul
Убери или закомментируй строку "TextDelimiter=none" и всё.
#56 by Serginio1
55+ TextDelimiter - определяет символ, которым отделяется текст. По умолчанию "
#57 by Serginio1
56 + но при этом часто бывает, что файла не всегда корректные и приходится их дорабатывать своими парсерами
#58 by Smallrat
посимвольное чтение ? это ж я поседею в процессе. бинго! ну еклмн, как все просто.... вроде бы 40 мегабайт csv загрузились корректно, на первый взгляд, щас напишу обработку таблицы и там видно будет. Всем большое спасибо! не оставили в беде )))
#59 by Eugeneer
вот готовое - гарантируем работу Читайет эксель и CSV напрямую - своя суперкомпонента. Скорость считывания 100 000 за 1 минуту.
#60 by zak555
что за суперко
#61 by zak555
и что за 500 придурков, которые вечно что-то грузят из эксель  ?
#62 by Eugeneer
;))
#63 by Serginio1
100 000 на Это менее 1 секунды Минута это очень много.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С