Читаем CSV...
Читаем CSV...
Это так - посмеятся...
Есть спецификация CSV и есть договоренность об том, что клиент будет поставлять данные в CSV -файлах.
У мелкомягких в Висуал Васике есть CSV-реадер.
Там, конечно, мелкомягкий вариант, но основную работу по чтению/нарезке и распаковке полей он делает.
Остальное уже можно подкрутить ручками...
Теперь основные проблемные моменты:
1. Вместо CSV-файла присылается Excel-файл.
Простенько и со вкусом - отредактировали в ехцеле, кликнули - отправить... ну а на нашей стороне надо разбираться - ексел то его открывает без проблем, а вот реадер - обламывается...
Починить на нашей стороне - можно, но довольно неприятно. Неприятность в основном в том, что получаются два разных формата одного документа и оба надо суппортить.
Не чиню - оператор запрашивает файл в правильном формате.
2. Количество запятых в заголовке не соответствует количеству запятых в данных.
Ну это понятное дело - тамошний прогер спецификацию на CSV в глаза не видел, но будет доказывать что его код работает правильно.
Починить тамошнего прогера - нереально. Реадер мелкомягких - работает, но количество возвращаемых полей не контролируется.
Так что на нашей стороне код адаптируется под чтение данных с разным количеством полей.
3. Второй заголовок в теле документа.
Выглядит так, что кто-то настраивал репорт и установил постраничный режим.
Вот так - по-странично - и выплевываются данные в файлик. С заголовками на каждой странице... но в сплошном документе,
Реадер мелкомягких вполне нормально читает второй заголовок... как строку данных.
Снова адаптируется код на нашей стороне.
4. Количество запятых в первом и последующем заголовках не совпадает.
Ну это такой пустячек... правда прогер клиента слегка подвисает от вопроса почему заголовки не совпадают, но это его не подвигает прочесть спецификацию.
Так же как и 3. - решается у нас по месту.
5. Пустые строки.
Обычно - в конце файла. Но может быть и в начеле, и в средине, Просто кто-то просматривал/правил файл и по случаю в пару-тройку раз нажал Ентер.
Не помню как реагирует мелкомягкий реадер - вроде возвращает строку с одним полем - но данных в любом случае там нет.
Опять - чинится у меня.
6. Куча строк без данных в документе.
Как это можно получить предстваляю плохо. Выглядит - нормально - строка с правильным - т.е. -1/+2 - количеством запятых.
Никаких данных между запятыми не наблюдается. Просто строка из запятых.
Ужас данной ситуации в том, что нашего оператора невозможно обучить распознаванию ситуации - в Екселе все выглядит прилично, никаких буковок на месте цифирек не имеется.
Но, как обычно, чинится на нашей стороне.
Можно, конечно и плакать над уровнем квалификации используемых прогеров, но... Я - не плачу, Я никогда не плачу, есть у меня другие интересы...
А вообще - интересует - Что еще можно сделать неправильно в экспорте данных в CSV-формате?
Я бы переписал реадер и позабыл об проблемах...
Что еще можно сделать неправильно в экспорте данных в CSV-формате?
Все.
Я бы переписал реадер и позабыл об проблемах...
Так перепиши и забудь.
Я читаю ексельные файлы в R/Origin (и поточно, и одиночными файлами, и с простой и со сложной структурой), если в файле проблема, затрудняющая его автоматическое прочтение - ставлю на уши того,... предметно беседую с тем, кто ответственен за генерацию этого файла(-ов). Уже пару лет как все проблемы с обменом данными прекратились после поиска взаимоприемлемого решения. ИМХО, нельзя предусмотреть все возможные глюки в файлах данных, если нет достаточной культуры их генерации. Если хоть где-то процесс ввода данных неавтоматизирован или не загнан в шаблоны с валидацией - все, пиши пропало. Фантазия людская границ не знает - иногда при анализе данных приходится сначала
устранять ошибки, ну, например, фамилию оператора вводили 13ю (!!) разными способами, а мне как раз надо смотреть, кто из операторов чаще всего косячил за последние месяцы. Объяснил, норот понял, сделали табличку операторов, автоматический выбор по логину и все. А монстрить высокоинтеллектуальный ридер, ИМХО, не стоит затраченных усилий. Проще договориться о темплейтах и валидации, сделать качественную "морду" для ввода данных. Но, конечно, вольному воля. Безумству храбрых поем мы песню... (с)
ЗЫ. Добавлю - можешь глянуть, как имплементировано чтение xls/xlsx в R (исходники функций всегда доступны). Не уверен, что это сделает твою жизнь легче, но с чем черт не шутит, вдруг наткнешься на какие-то идеи. Код там вполне понятный, сильно голову ломать не надо. ИМХО, конечно. Впрочем, это я так, для
очистки совести. Понимаю, что желания лезть в малознакомый код особо не возникнет.
Так перепиши и забудь.
------
Для этого надо собрать все возможные ошибки.
Бо, править читалку под каждый баг Я могу и сейчас...
предметно беседую с тем, кто ответственен за генерацию
-----
Мне сие не разрешено.
фамилию оператора вводили 13ю (!!) разными способами
------
Ну это вообще фигня - у меня в выдаваемых государствием документах - паспорте, ИД, вод.правах - фамилия написана 4-мя разными способами.
В одной только переведенной копии свидетельства о рождении есть три различных написаниия фамилии.
И, что характерно, все написания соответствуют законам... и ни одно не соответствует фамилии родителей.
Проще договориться о темплейтах и валидации, сделать качественную "морду" для ввода данных.
-----
ЗА-ПРЕ-ЩЕ-НО.
Максимум, что Я мог сделать - послать прогеру ссыль на RFC по CSV.
Но ему на документацию покласть... тем более - она не внутреняя... и для генерации он пользуется чем-то покупным.
можешь глянуть, как имплементировано чтение xls/xlsx
-----
У меня нет проблемы читать/писать ехцеловский файл - в аутматион все вполне работает - пользуюсь там, где надо читать/писать xls/xlsx.
Есть небольшая проблема в версиях - поддерживаю только 12-ю, а на разъездных лаптях иногда требуют и ставят другие.
Тут же вопрос об CSV.
Для этого надо собрать все возможные ошибки.
Нереально. Но ты можешь включить фантазию и, не исключено, составишь список наиболее частых. Всех - "эт вряд ли" (с) Т-щ Сухов.
Ну это вообще фигня
Фигня, конечно, пока не нужно генерировать pivot-таблицу (ну, или аналог).
ЗА-ПРЕ-ЩЕ-НО.
"Ты же коммунист, Сидоров!" (с) Подними восстание. Rage Against Erroneous Input. Найди подход. Ну, или страдай/наслаждайся (можно одновременно) написанием высокоинтеллектуального анализатора содержимого.
Тут же вопрос об CSV.
Да пофигу. Там и комма сепарэйтед тоже рядом прописаны. Наверняка внутре одинаково "перевариваются". Я о логике анализа данных - определение структуры, вычленение заголовков, обработка пропусков и ошибок и т.п.
Нереально.
------
Угу... но - надо.
Пока для каждого клиента пишется реадер со своими заморочками...
Причем многие из них одинаковы для всех. Точнее - в большинстве случаев без проблем будет работать самый навороченный...
Фигня, конечно, пока не нужно генерировать pivot-таблицу
-----
Не-е... таблица - точно полная фигня...
Вот когда надо доказывать права на собственность, а в документах - другая фамилия - начинается веселуха...
Особенно красиво - сдаешь паспорт на замену, а тебе говорят - надо, без паспорта, поехать в другую страну и получить там в закрытом архиве справочку...
А таблица - фииии...
Найди подход.
-----
Не-а... Клиент - важный. Да, прогер у них совсем никакой, но заказов от них много и заказы достаточно дорогие.
Так что - пИсать, пИсать и еще раз пИсать кипятком на форумах, а потом садится и писАть...
Наверняка внутре одинаково
-----
В Екселе - проблемнее. Он слишком много делает не явно.
А с текстовым файлом Я вполне управлюсь... хоть построчно, хоть массивом...
Тут как-то появился клиент, который "решил" (точнее - не способен на другое) присылать файл с каким-то отчетом в ХМЛ.
Отчет можно смотреть только каким-то дервним вьювером, который есть у него и который уже 100 лет как не поддерживается(?).
Читалки - нет, описания формата - нет, какой-либо информации на форумах - нет...
Ну и что? Читаю... поковырять пришлось, де-сериализатор слепить и немного логики... Все встало по местам и работает на ять.
------
А как еще перерывы в кодинге делать и негатив в позитив переводить?
Да, починил последнюю из глупостей со строками из запятых... (см. ниже)
-----
.. и теперь пытаюсь понять почему давно налаженная схема деплоймента из ВМ на сервак и далее с апдейтами на клиентов на одной машине начала давать непонятнмый глюк - все апдейтится, аппа запускается - есть в процессах, но главную форму - не показывает. Админы уже все волоски во всех местах повыдергивали - понять не могут что и где билли в очердной раз в тихую поменял...
Ну вот - починили...
Блин... обшлось, как оказалось, без билли... признаю - чистейший поклеп и напраслину возвел...
первое - поменяли локальные ДНС-сервера, а на ВМке остались прописаны старые... ну понятно - он не в домене и в оффлайне...
второе - Я таки где-то нахомутал - задеплоил дебужную версию... а в дебужной у меня загрузка в отладчике, если запущено не из-под него... ну а толадчиков на станциях нет... вот все и подвисало...
Пых... таки починили... до следующего аврала...
возьми test suite из apache commons csv (https://commons.apache.org/proper/commons-csv/) и не парься - у них должны быть всякие варианты файлов. или из питона, или из любой другой библиотеки...
Классика: автоматизация бардака дает автоматизированный бардак. Символы всякие забавные могут там еще быть, перепутанные кириллица и латиница.
У вас есть руководство, или, может, вы сами уполномочены вести переговоры с клиентской стороной, чтобы вам присылали что-то более-менее потребное? Клиентские прогеры неплохо чинятся их менеджерами, в крайнем случае сажается за дело очередной бесполезный практикант, который вылизывает ручками перед отправкой вам.
Не нашел упоминания об test suite.
Прямой линк на страничку с доками/довнлоадом можно попросить?
И... кажется ты не совсем понимаешь проблему - мне присылают файлы называемые ЦСВ, но не соответствующие спецификации.
Второе - жабья версия только добавит проблем...
Клиентские прогеры неплохо чинятся
-----
На производстве клиентские прогеры не чинятся. Особенно - прогеры крупных клиентов.
Ибо починка клиентского прогера ведет к дискомфорту последнего и передаче (части) заказов другому производителю.
Просто прикинь ситуацию, когда одним из клиентских прогеров выступил какой-нибудь из директоров компании...
Прикинула? Починяешь? Ну вот то-то...
чтобы вам присылали что-то более-менее потребное?
-----
Присылка потребного - оговорена - должны присылать CSV.
Ну а что именно присылают - описано выше.
На производстве клиентские прогеры не чинятся. Особенно - прогеры крупных клиентов.
Мой текущий клиент - ДАХ30, производство. Прекрасно чинятся, медленно, но это уже не мои сложности. Клиентом нашей фирмы являются уже лет 10 как точно.
Чтобы было понятнее об чем речь - фрагмент 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", может быть от одной до трех.
Сколько ДРУГИХ строк может присутствовать - Я до сих пор не знаю.
Мой текущий клиент - ДАХ30, производство.
-----
Именно - чинится там где производится, а не там откуда заказывается...
Хотя мелочь, которую не жалко потерять, можно попробовать чинить и и заказчика...
Предудущий прогер - пробовал... даже получил от них документ в "приблизительно нужном формате"... потом - свихнулся... и мне пришлось делать читалку-конвертилку...
я думаю что ты путаешь людей - 5 строк - это не одна CSV запись - это 5 CSV записей из которых надо сформировать логическую запись...
просто надо разбить на два этапа - парсинг CSV, и формирование из распарсенных данных логических записей - для второй части - обычная state machine...
-----
Я тако буду иметь желание настаивать на том, что Я имею возможность понимать и предоставлять информацию достаточно правильно.
это 5 CSV записей
-----
А ничего что по РФЦ ЦСВ - "плоский" файл?
на два этапа
------
Ну так и сделано.
Но проблема в том, что это не ЦСВ-источник.
Хорошо еще, что у меня было достаточно времени, чтобы, несмотря на клятвенные заверения в ЦСВ-тости источников, изначально делать отдельные реадеры и конверторы под каждого из клиентов . Ну да - муторно, но хоть как-то унифицированно и работает.
А если открыть ексель и сохранить файлик в CSV формате?
Тогда он будет уже читабельным.
Ошибки с количеством стобцов могут сохраниться. Напиши какой-нибудь препроцессор,
для нормирования столбцов. На скорую руку можно написать в питоне. Все ошибки твой скрипт исправит за считанные секунды.
Ошибки самих данных никак не исправить - тогда можно начинать самому данные писать.
Потом, после нормирования - не знаю пользуетесь вы этим или нет - есть возможность импортировать данные в
одну комманду в постгрез.
И оттуда делать с данными что душа пожелает.
Присылка потребного - оговорена - должны присылать CSV.
ну тогда нужно "бить" того кто договаривался. Это слишком общее описание. Должен быть оговорен точный формат данных.
А так будешь постоянно править реадер да и еще неизвестно - правильно ли интерпретируешь результат.
Можно еще попытать узнать каким способом они получают присылаемый вам файл? Может есть какой то "оригинальный" формат.
-----
Для этого нужно обучить оператора способу определения того, что файл в ехцел-формате.
Работа у операторов довольно неприятная - тупая, ответственная и малооплачиваемая.
Операторы - именно такой квалификации и там мало кто задерживается дольше пары месяцев.
Соответственно - обучать надо регулярно... А мне оно нужно?
Напиши какой-нибудь препроцессор
-----
Так и делается.
Под каждого клиента/документ - свой, отдельный считыватель исходного документа.
Но это - лишний, по сравнению с обработкой корректного ЦСВ, код.
есть возможность импортировать данные в одну комманду в постгрез.
-----
Уууу... как мне было бы хорошо, если бы можно было пошуршать данными и потом закинуть их в базу...
Есть целая и довольно сложная система обработки.
Для нее готовится файл в определенном формате. Точнее - в одном из десятка+ форматов.
Последняя известная спецификация имеет номер 18 (и в спеках есть ошибки).
При импорте данных происходит проверка допустимости данных и крутой персчет разных цифирек.
Всех деталей персчета Я не знаю - мое дело - подготовить файлик для импорта.
Причем фабрик у меня три и на одной версия не совпадает с двумя другими.
А по задачке - надо на любом рабочем месте готовить данные для любой фабрики.
И оттуда делать с данными что душа пожелает.
-----
Ну еще и миграция ожидается - будет заменена текущая версия большой системы.
Вот такая одна команда.
Ну да пустяки - по сравнению с фокусами в ЦСВ - остальное почти не напрягает.