Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Читаем CSV...

742  1 2 все
Murr патриот11.06.19 11:49
Murr
NEW 11.06.19 11:49 

Читаем CSV...


Это так - посмеятся...


Есть спецификация CSV и есть договоренность об том, что клиент будет поставлять данные в CSV -файлах.


У мелкомягких в Висуал Васике есть CSV-реадер.

Там, конечно, мелкомягкий вариант, но основную работу по чтению/нарезке и распаковке полей он делает.

Остальное уже можно подкрутить ручками...


Теперь основные проблемные моменты:


1. Вместо CSV-файла присылается Excel-файл.

Простенько и со вкусом - отредактировали в ехцеле, кликнули - отправить... ну а на нашей стороне надо разбираться - ексел то его открывает без проблем, а вот реадер - обламывается...

Починить на нашей стороне - можно, но довольно неприятно. Неприятность в основном в том, что получаются два разных формата одного документа и оба надо суппортить.

Не чиню - оператор запрашивает файл в правильном формате.


2. Количество запятых в заголовке не соответствует количеству запятых в данных.

Ну это понятное дело - тамошний прогер спецификацию на CSV в глаза не видел, но будет доказывать что его код работает правильно.

Починить тамошнего прогера - нереально. Реадер мелкомягких - работает, но количество возвращаемых полей не контролируется.

Так что на нашей стороне код адаптируется под чтение данных с разным количеством полей.


3. Второй заголовок в теле документа.

Выглядит так, что кто-то настраивал репорт и установил постраничный режим.

Вот так - по-странично - и выплевываются данные в файлик. С заголовками на каждой странице... но в сплошном документе,

Реадер мелкомягких вполне нормально читает второй заголовок... как строку данных.

Снова адаптируется код на нашей стороне.


4. Количество запятых в первом и последующем заголовках не совпадает.

Ну это такой пустячек... правда прогер клиента слегка подвисает от вопроса почему заголовки не совпадают, но это его не подвигает прочесть спецификацию.

Так же как и 3. - решается у нас по месту.


5. Пустые строки.

Обычно - в конце файла. Но может быть и в начеле, и в средине, Просто кто-то просматривал/правил файл и по случаю в пару-тройку раз нажал Ентер.

Не помню как реагирует мелкомягкий реадер - вроде возвращает строку с одним полем - но данных в любом случае там нет.

Опять - чинится у меня.


6. Куча строк без данных в документе.

Как это можно получить предстваляю плохо. Выглядит - нормально - строка с правильным - т.е. -1/+2 - количеством запятых.

Никаких данных между запятыми не наблюдается. Просто строка из запятых.

Ужас данной ситуации в том, что нашего оператора невозможно обучить распознаванию ситуации - в Екселе все выглядит прилично, никаких буковок на месте цифирек не имеется.

Но, как обычно, чинится на нашей стороне.


Можно, конечно и плакать над уровнем квалификации используемых прогеров, но... Я - не плачу, Я никогда не плачу, есть у меня другие интересы...


А вообще - интересует - Что еще можно сделать неправильно в экспорте данных в CSV-формате?

Я бы переписал реадер и позабыл об проблемах...


#1 
dArtagnan постоялец11.06.19 12:20
dArtagnan
11.06.19 12:20 
в ответ Murr 11.06.19 11:49, Последний раз изменено 11.06.19 12:24 (dArtagnan)
Что еще можно сделать неправильно в экспорте данных в CSV-формате?

Все.

Я бы переписал реадер и позабыл об проблемах...

Так перепиши и забудь.


Я читаю ексельные файлы в R/Origin (и поточно, и одиночными файлами, и с простой и со сложной структурой), если в файле проблема, затрудняющая его автоматическое прочтение - ставлю на уши того,... предметно беседую с тем, кто ответственен за генерацию этого файла(-ов). Уже пару лет как все проблемы с обменом данными прекратились после поиска взаимоприемлемого решения. ИМХО, нельзя предусмотреть все возможные глюки в файлах данных, если нет достаточной культуры их генерации. Если хоть где-то процесс ввода данных неавтоматизирован или не загнан в шаблоны с валидацией - все, пиши пропало. Фантазия людская границ не знает - иногда при анализе данных приходится сначала устранять ошибки, ну, например, фамилию оператора вводили 13ю (!!) разными способами, а мне как раз надо смотреть, кто из операторов чаще всего косячил за последние месяцы. Объяснил, норот понял, сделали табличку операторов, автоматический выбор по логину и все. А монстрить высокоинтеллектуальный ридер, ИМХО, не стоит затраченных усилий. Проще договориться о темплейтах и валидации, сделать качественную "морду" для ввода данных. Но, конечно, вольному воля. Безумству храбрых поем мы песню... (с)


ЗЫ. Добавлю - можешь глянуть, как имплементировано чтение xls/xlsx в R (исходники функций всегда доступны). Не уверен, что это сделает твою жизнь легче, но с чем черт не шутит, вдруг наткнешься на какие-то идеи. Код там вполне понятный, сильно голову ломать не надо. ИМХО, конечно. Впрочем, это я так, для очистки совести. Понимаю, что желания лезть в малознакомый код особо не возникнет.

#2 
Murr патриот11.06.19 12:51
Murr
NEW 11.06.19 12:51 
в ответ dArtagnan 11.06.19 12:20, Последний раз изменено 11.06.19 12:53 (Murr)

Так перепиши и забудь.

------

Для этого надо собрать все возможные ошибки.

Бо, править читалку под каждый баг Я могу и сейчас...


предметно беседую с тем, кто ответственен за генерацию

-----

Мне сие не разрешено.


фамилию оператора вводили 13ю (!!) разными способами

------

Ну это вообще фигня - у меня в выдаваемых государствием документах - паспорте, ИД, вод.правах - фамилия написана 4-мя разными способами.

В одной только переведенной копии свидетельства о рождении есть три различных написаниия фамилии.

И, что характерно, все написания соответствуют законам... и ни одно не соответствует фамилии родителей.


Проще договориться о темплейтах и валидации, сделать качественную "морду" для ввода данных.

-----

ЗА-ПРЕ-ЩЕ-НО.

Максимум, что Я мог сделать - послать прогеру ссыль на RFC по CSV.

Но ему на документацию покласть... тем более - она не внутреняя... и для генерации он пользуется чем-то покупным.


можешь глянуть, как имплементировано чтение xls/xlsx

-----

У меня нет проблемы читать/писать ехцеловский файл - в аутматион все вполне работает - пользуюсь там, где надо читать/писать xls/xlsx.

Есть небольшая проблема в версиях - поддерживаю только 12-ю, а на разъездных лаптях иногда требуют и ставят другие.


Тут же вопрос об CSV.


#3 
dArtagnan постоялец11.06.19 14:02
dArtagnan
NEW 11.06.19 14:02 
в ответ Murr 11.06.19 12:51
Для этого надо собрать все возможные ошибки.

Нереально. Но ты можешь включить фантазию и, не исключено, составишь список наиболее частых. Всех - "эт вряд ли" (с) Т-щ Сухов.

Ну это вообще фигня

Фигня, конечно, пока не нужно генерировать pivot-таблицу (ну, или аналог).

ЗА-ПРЕ-ЩЕ-НО.

"Ты же коммунист, Сидоров!" (с) Подними восстание. Rage Against Erroneous Input. Найди подход. Ну, или страдай/наслаждайся (можно одновременно) написанием высокоинтеллектуального анализатора содержимого.

Тут же вопрос об CSV.

Да пофигу. Там и комма сепарэйтед тоже рядом прописаны. Наверняка внутре одинаково "перевариваются". Я о логике анализа данных - определение структуры, вычленение заголовков, обработка пропусков и ошибок и т.п.

#4 
Murr патриот11.06.19 15:34
Murr
NEW 11.06.19 15:34 
в ответ dArtagnan 11.06.19 14:02

Нереально.

------

Угу... но - надо.

Пока для каждого клиента пишется реадер со своими заморочками...

Причем многие из них одинаковы для всех. Точнее - в большинстве случаев без проблем будет работать самый навороченный...


Фигня, конечно, пока не нужно генерировать pivot-таблицу

-----

Не-е... таблица - точно полная фигня...

Вот когда надо доказывать права на собственность, а в документах - другая фамилия - начинается веселуха...

Особенно красиво - сдаешь паспорт на замену, а тебе говорят - надо, без паспорта, поехать в другую страну и получить там в закрытом архиве справочку...

А таблица - фииии...



Найди подход.

-----

Не-а... Клиент - важный. Да, прогер у них совсем никакой, но заказов от них много и заказы достаточно дорогие.

Так что - пИсать, пИсать и еще раз пИсать кипятком на форумах, а потом садится и писАть...



Наверняка внутре одинаково

-----

В Екселе - проблемнее. Он слишком много делает не явно.

А с текстовым файлом Я вполне управлюсь... хоть построчно, хоть массивом...


Тут как-то появился клиент, который "решил" (точнее - не способен на другое) присылать файл с каким-то отчетом в ХМЛ.

Отчет можно смотреть только каким-то дервним вьювером, который есть у него и который уже 100 лет как не поддерживается(?).

Читалки - нет, описания формата - нет, какой-либо информации на форумах - нет...

Ну и что? Читаю... поковырять пришлось, де-сериализатор слепить и немного логики... Все встало по местам и работает на ять.



#5 
dArtagnan постоялец11.06.19 15:52
dArtagnan
NEW 11.06.19 15:52 
в ответ Murr 11.06.19 15:34

Ну, тогда страдай, познавая безграничность человеческих ошибок. У меня нет сомнений, что такому мазохисту, как ты, это доставит массу удовольствия. А еще ты сможешь неоднократно поныть на эту тему. И задрать лапу на M$.

#6 
Murr патриот12.06.19 11:12
Murr
NEW 12.06.19 11:12 
в ответ dArtagnan 11.06.19 15:52
А еще ты сможешь неоднократно поныть на эту тему.

------

А как еще перерывы в кодинге делать и негатив в позитив переводить? улыб


Да, починил последнюю из глупостей со строками из запятых... (см. ниже)


И задрать лапу на M$.

-----

.. и теперь пытаюсь понять почему давно налаженная схема деплоймента из ВМ на сервак и далее с апдейтами на клиентов на одной машине начала давать непонятнмый глюк - все апдейтится, аппа запускается - есть в процессах, но главную форму - не показывает. Админы уже все волоски во всех местах повыдергивали - понять не могут что и где билли в очердной раз в тихую поменял...


#7 
Murr патриот12.06.19 13:27
Murr
NEW 12.06.19 13:27 
в ответ Murr 12.06.19 11:12

Ну вот - починили...

Блин... обшлось, как оказалось, без билли... признаю - чистейший поклеп и напраслину возвел...

первое - поменяли локальные ДНС-сервера, а на ВМке остались прописаны старые... ну понятно - он не в домене и в оффлайне...

второе - Я таки где-то нахомутал - задеплоил дебужную версию... а в дебужной у меня загрузка в отладчике, если запущено не из-под него... ну а толадчиков на станциях нет... вот все и подвисало...


Пых... таки починили... до следующего аврала...

#8 
AlexOtt местный житель12.06.19 13:29
AlexOtt
NEW 12.06.19 13:29 
в ответ Murr 11.06.19 12:51

возьми test suite из apache commons csv (https://commons.apache.org/proper/commons-csv/) и не парься - у них должны быть всякие варианты файлов. или из питона, или из любой другой библиотеки...


#9 
NachDeutschland коренной житель12.06.19 13:46
NachDeutschland
NEW 12.06.19 13:46 
в ответ Murr 11.06.19 11:49

Классика: автоматизация бардака дает автоматизированный бардак. Символы всякие забавные могут там еще быть, перепутанные кириллица и латиница.


У вас есть руководство, или, может, вы сами уполномочены вести переговоры с клиентской стороной, чтобы вам присылали что-то более-менее потребное? Клиентские прогеры неплохо чинятся их менеджерами, в крайнем случае сажается за дело очередной бесполезный практикант, который вылизывает ручками перед отправкой вам.

Что совой об пень, что пнём об сову.
#10 
Murr патриот12.06.19 13:47
Murr
NEW 12.06.19 13:47 
в ответ AlexOtt 12.06.19 13:29

Не нашел упоминания об test suite.

Прямой линк на страничку с доками/довнлоадом можно попросить?


И... кажется ты не совсем понимаешь проблему - мне присылают файлы называемые ЦСВ, но не соответствующие спецификации.

Второе - жабья версия только добавит проблем...

#11 
Murr патриот12.06.19 13:54
Murr
NEW 12.06.19 13:54 
в ответ NachDeutschland 12.06.19 13:46

Клиентские прогеры неплохо чинятся

-----

На производстве клиентские прогеры не чинятся. Особенно - прогеры крупных клиентов.

Ибо починка клиентского прогера ведет к дискомфорту последнего и передаче (части) заказов другому производителю.

Просто прикинь ситуацию, когда одним из клиентских прогеров выступил какой-нибудь из директоров компании...

Прикинула? Починяешь? Ну вот то-то...


чтобы вам присылали что-то более-менее потребное?

-----

Присылка потребного - оговорена - должны присылать CSV.

Ну а что именно присылают - описано выше.


#12 
NachDeutschland коренной житель12.06.19 14:04
NachDeutschland
NEW 12.06.19 14:04 
в ответ Murr 12.06.19 13:54
На производстве клиентские прогеры не чинятся. Особенно - прогеры крупных клиентов.

Мой текущий клиент - ДАХ30, производство. Прекрасно чинятся, медленно, но это уже не мои сложности. Клиентом нашей фирмы являются уже лет 10 как точно.

Что совой об пень, что пнём об сову.
#13 
Murr патриот12.06.19 14:06
Murr
NEW 12.06.19 14:06 
в ответ AlexOtt 12.06.19 13:29

Чтобы было понятнее об чем речь - фрагмент CSV:

B,P7833,02/07/15,KW,08,F464542,08/07/15,
H,NR1867AT,1, ,N,,P7833-001,02:WTN-NR1867AT/R26/001,
G,A1,GM4002,LOW IRON 4MM CLEAR,20,GE4075,Ev Low E Soft Coat,0, , ,B,SUES+,469,0,0,199,0,0,0,0,0,N,0,0,0,N,W,0,,0, , ,, ,N,,02:WTN-NR1867AT/R26/001/A1,
G,A2,GB4502,LOW IRON TG CLEAR,20,GF4575,Ev LowE SftCoat tg,0, , ,B,SUES+,469,0,0,634,0,0,0,0,0,N,0,0,0,N,W,0,,0, , ,, ,N,,02:WTN-NR1867AT/R26/001/A2,
G,B1,GB4502,LOW IRON TG CLEAR,20,GF4575,Ev LowE SftCoat tg,0, , ,B,SUES+,1118,0,0,1057,0,0,0,0,0,N,0,0,0,N,W,0,,0, , ,, ,N,,02:WTN-NR1867AT/R26/001/B1,

Эти 5 строк есть ОДНА CSV-запись.

Для полного комфорта - строк, начинающихся с "G", может быть от одной до трех.

Сколько ДРУГИХ строк может присутствовать - Я до сих пор не знаю.безум


#14 
Murr патриот12.06.19 14:07
Murr
NEW 12.06.19 14:07 
в ответ NachDeutschland 12.06.19 14:04, Последний раз изменено 12.06.19 14:10 (Murr)

Мой текущий клиент - ДАХ30, производство.

-----

Именно - чинится там где производится, а не там откуда заказывается...

Хотя мелочь, которую не жалко потерять, можно попробовать чинить и и заказчика...

Предудущий прогер - пробовал... даже получил от них документ в "приблизительно нужном формате"... потом - свихнулся... и мне пришлось делать читалку-конвертилку...

#15 
AlexOtt местный житель13.06.19 15:18
AlexOtt
NEW 13.06.19 15:18 
в ответ Murr 12.06.19 14:06

я думаю что ты путаешь людей - 5 строк - это не одна CSV запись - это 5 CSV записей из которых надо сформировать логическую запись...

просто надо разбить на два этапа - парсинг CSV, и формирование из распарсенных данных логических записей - для второй части - обычная state machine...

#16 
Murr патриот13.06.19 17:32
Murr
NEW 13.06.19 17:32 
в ответ AlexOtt 13.06.19 15:18
я думаю что ты путаешь

-----

Я тако буду иметь желание настаивать на том, что Я имею возможность понимать и предоставлять информацию достаточно правильно.


это 5 CSV записей

-----

А ничего что по РФЦ ЦСВ - "плоский" файл? улыб


на два этапа

------

Ну так и сделано.

Но проблема в том, что это не ЦСВ-источник.

Хорошо еще, что у меня было достаточно времени, чтобы, несмотря на клятвенные заверения в ЦСВ-тости источников, изначально делать отдельные реадеры и конверторы под каждого из клиентов . Ну да - муторно, но хоть как-то унифицированно и работает. спок


#17 
evgher местный житель15.06.19 22:57
evgher
NEW 15.06.19 22:57 
в ответ Murr 11.06.19 11:49

А если открыть ексель и сохранить файлик в CSV формате?

Тогда он будет уже читабельным.


Ошибки с количеством стобцов могут сохраниться. Напиши какой-нибудь препроцессор,

для нормирования столбцов. На скорую руку можно написать в питоне. Все ошибки твой скрипт исправит за считанные секунды.


Ошибки самих данных никак не исправить - тогда можно начинать самому данные писать.


Потом, после нормирования - не знаю пользуетесь вы этим или нет - есть возможность импортировать данные в

одну комманду в постгрез.


И оттуда делать с данными что душа пожелает.


#18 
AlexNek патриот15.06.19 23:50
AlexNek
NEW 15.06.19 23:50 
в ответ Murr 12.06.19 13:54
Присылка потребного - оговорена - должны присылать CSV.

ну тогда нужно "бить" того кто договаривался. Это слишком общее описание. Должен быть оговорен точный формат данных.

А так будешь постоянно править реадер да и еще неизвестно - правильно ли интерпретируешь результат.

Можно еще попытать узнать каким способом они получают присылаемый вам файл? Может есть какой то "оригинальный" формат.

#19 
Murr патриот17.06.19 10:27
Murr
NEW 17.06.19 10:27 
в ответ evgher 15.06.19 22:57
А если открыть ексель и сохранить файлик в CSV формате?

-----

Для этого нужно обучить оператора способу определения того, что файл в ехцел-формате.

Работа у операторов довольно неприятная - тупая, ответственная и малооплачиваемая.

Операторы - именно такой квалификации и там мало кто задерживается дольше пары месяцев.

Соответственно - обучать надо регулярно... А мне оно нужно?


Напиши какой-нибудь препроцессор

-----

Так и делается.

Под каждого клиента/документ - свой, отдельный считыватель исходного документа.

Но это - лишний, по сравнению с обработкой корректного ЦСВ, код.


есть возможность импортировать данные в одну комманду в постгрез.

-----

Уууу... как мне было бы хорошо, если бы можно было пошуршать данными и потом закинуть их в базу...

Есть целая и довольно сложная система обработки.

Для нее готовится файл в определенном формате. Точнее - в одном из десятка+ форматов.

Последняя известная спецификация имеет номер 18 (и в спеках есть ошибки).

При импорте данных происходит проверка допустимости данных и крутой персчет разных цифирек.

Всех деталей персчета Я не знаю - мое дело - подготовить файлик для импорта.


Причем фабрик у меня три и на одной версия не совпадает с двумя другими.

А по задачке - надо на любом рабочем месте готовить данные для любой фабрики.


И оттуда делать с данными что душа пожелает.

-----

Ну еще и миграция ожидается - будет заменена текущая версия большой системы.

Вот такая одна команда.


Ну да пустяки - по сравнению с фокусами в ЦСВ - остальное почти не напрягает. спок


#20 
1 2 все