Как мы можем проверить файл 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
, возможно, какой-то другой функцией, специфичной для моего проекта), в любом случае, если я не могу прочитать одну строку с моей функцией, которая читает сотни, это, вероятно, потому что в этой строке есть проблема) Если все идет хорошо – ну, не намного больше делать, кроме использования данных 😉
И когда вы закончите с одной строкой, просто переходите к следующему.
Конечно, если вы хотите либо принять, либо отклонить весь файл, прежде чем делать какую-либо базу данных (или что-то еще подобное) , вам нужно:
В вашем конкретном случае у вас есть три вида полей:
Date;Id;Shown 15-Mar-10;231;345 15-Mar-10;232;346
Из того, что я могу догадаться:
strtotime
(не уверен, что все в порядке для используемого вами формата) explode
строку
Jan
, Feb
, Mar
, … Вы можете использовать регулярное выражение для поиска строк, которые соответствуют (и, следовательно, флаг тех, которые этого не делают). Посмотрите на эту ссылку . При этом вам нужно будет прочитать весь файл, чтобы проверить его, поэтому вам, вероятно, лучше всего просто попытаться разобрать его в первый раз и поймать любые ошибки.
Ожидайте, что данные, которые вы читаете, действительны, и просто игнорируйте любые строки, которые выглядят недействительными или имеют неожиданный формат.
CSV используется для обмена данными или хранения данных. Поэтому очень вероятно, что он был «действительным», когда файлы были сгенерированы. Если по какой-либо причине у вас есть CSV-файл в качестве пользовательского ввода (единственный реальный источник, из которого могут поступать недействительные или неожиданные данные), нет никаких проблем с игнорированием этих данных и сообщением пользователю о недопустимых строках.
Я написал инструмент Python с открытым исходным кодом для упрощения проверки таких файлов, доступных с http://pypi.python.org/pypi/cutplace/ .
Основная идея заключается в том, что вы описываете формат данных в спецификации структурированного интерфейса, используя OpenOffice.org, Excel или обычный CSV. Это делается через несколько минут и достаточно читаемо, чтобы служить в документации. Мы используем его для проверки файлов с примерно 200 000 строк на ежедневной основе.
Вы можете проверить файл CSV с помощью командной строки:
cutplace specification.csv data.csv
В случае обнаружения недействительных строк данных код выхода равен 1. Если вам нужно больше контроля, вы можете написать небольшой скрипт Python, который импортирует модуль cutplace и добавляет слушателя для событий проверки.
В качестве примера, вот спецификация, которая проверила бы данные образца, которые вы предоставили, заполнив пробелы в вашем кратком описании, сделав несколько предположений. (Я пишу спецификацию в CSV, чтобы вставить ее в этот пост. На практике я предпочитаю Calc и ODS OpenOffice.org, потому что я могу использовать больше форматов и упрощать их чтение и обслуживание).
,"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-[AZ][az][az]-\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» в столбце «Пусто»:
,"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"
Любая строка, начинающаяся с пустого столбца, может содержать любой текст, который вам нравится, и не будет обрабатываться во время проверки. Это полезно для заголовков, комментариев и т. Д.
Вам не нужно проверять ввод, он будет возвращать FALSE, если произошла ошибка.