Как мы можем проверить файл CSV?
У меня есть файл CSV структуры:
Date;Id;Shown
15-Mar-10;231;345
15-Mar-10;232;346
and so on and on !!! approx around 80,000 rows.
Как я могу проверить этот файл CSV прежде, чем запустить использование парсинга fgetcsv
?
Я бы не пытался проверить файл раньше рука: Я бы предпочел пройтись по строке за строкой, работая с каждой строкой отдельно:
Что может означать «проверить, что все в порядке»?
fgetcsv
, может быть какая-то другая функция, специфичная для моего проекта - в любом случае, если я не могу прочитать одну строку с моей функцией, которая читает сотни, это, вероятно, из-за проблемы в этой строке) Если все идет нормально - ну, больше нечего делать, данные используют исключения; -) {{1} }
И когда вы закончите с одной строкой, просто повторите для следующей.
Конечно, если вы хотите принять или отклонить весь файл перед записью в любую базу данных (или что-то подобное) , вам придется:
В вашем конкретном случае у вас есть три вида полей:
Date;Id;Shown
15-Mar-10;231;345
15-Mar-10;232;346
Насколько я могу догадаться:
strtotime
(хотя не уверен, что это подходит для используемого вами формата) взорвал
строку { {1}}
января
, февраля
, мар
, ... Я написал инструмент Python с открытым исходным кодом для упрощения проверки таких файлов, доступный на http://pypi.python.org/pypi/cutplace/.
Основная идея заключается в том, что вы описываете формат данных в структурированной спецификации интерфейса с помощью OpenOffice.org, Excel или простого CSV. Это делается за несколько минут и достаточно разборчиво, чтобы служить в качестве документации. Мы используем его для ежедневной проверки файлов, содержащих около 200.000 строк.
Вы можете проверить CSV-файл с помощью командной строки:
cutplace specification.csv data.csv
В случае обнаружения недопустимых строк данных код выхода будет равен 1. Если вам нужно больше контроля, вы можете написать небольшой сценарий на Python, который импортирует модуль cutplace и добавляет слушателя для событий проверки.
В качестве примера, вот спецификация, которая будет проверять предоставленный вами образец данных, заполняя пробелы вашего краткого описания, делая несколько предположений. (Я пишу спецификацию в CSV, чтобы вставить ее в этот пост. На практике я предпочитаю OpenOffice.org's Calc и ODS, потому что я могу использовать больше форматов и сделать их более удобными для чтения и сопровождения.)
,"Interface: Show statistics"
,
,"Data format"
"D","Format","CSV"
"D","Item delimiter",";"
"D","Header","1"
"D","Encoding","ASCII"
,
,"Fields"
,"Name","Example","Empty","Length","Type","Rule"
"F","date","15-Mar-10",,,"RegEx","\d\d-[A-Z][a-z][a-z]-\d\d"
"F","id","231",,,"Integer","0:"
"F","shown","345",,,"Integer","0:"
,
,"Checks"
,"Description","Type","Rule"
"C","id per date must be unique","IsUnique","date, id"
Строки, начинающиеся с "D", описывают основной формат данных. В данном случае это CSV-файл, использующий ";" в качестве разделителя с 1 строкой заголовка в кодировке ASCII.
Строки, начинающиеся с "F", описывают различные поля. Например,
,"Name","Example","Empty","Length","Type","Rule"
"F","id","231",,,"Integer","0:"
определяет обязательное поле "id" типа Integer со значением 0 или больше. Чтобы позволить полю быть пустым, укажите "X" в колонке "Empty":
,"Name","Example","Empty","Length","Type","Rule"
"F","id","231","X",,"Integer","0:"
Наконец, есть необязательная секция, содержащая дополнительные проверки, порождающие весь файл, а не только отдельные строки. Например, если каждая дата в вашем файле должна предоставлять дату для идентификатора только один раз, вы можете указать это, используя:
,"Description","Type","Rule"
"C","id per date must be unique","IsUnique","date, id"
Любая строка, которая начинается с пустого столбца, может содержать любой текст, который вам нравится, и не будет обрабатываться во время проверки. Это полезно для заголовков, комментариев и т.д.
Вы можете использовать регулярное выражение, чтобы найти строки, которые соответствуют (и, следовательно, пометить те, которые не совпадают). Взгляните на эту ссылку . При этом вам нужно будет прочитать весь файл, чтобы проверить его, поэтому вам, вероятно, лучше просто попытаться проанализировать его с первого раза и отловить любые ошибки.
Ожидайте, что данные, которые вы читаете, действительны, и просто игнорируйте любые строки, которые кажутся недействительными или имеют неожиданный формат.
CSV используется для обмена данными или в качестве хранилища данных. Поэтому вполне вероятно, что он уже был "валидным", когда создавались файлы. Если вы - по какой-либо причине - имеете CSV-файл в качестве пользовательского ввода (единственный реальный источник, откуда могут прийти недействительные или неожиданные данные), нет никаких проблем с игнорированием этих данных и сообщением пользователю о недействительных строках.