Как проверить файл CSV?

Как мы можем проверить файл 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 ?

12
задан Rachel 15 March 2010 в 20:42
поделиться

4 ответа

Я бы не пытался проверить файл раньше рука: Я бы предпочел пройтись по строке за строкой, работая с каждой строкой отдельно:

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


Что может означать «проверить, что все в порядке»?

  • По крайней мере: убедитесь, что я могу прочитать строку как CSV, с моим обычным набором функций (возможно, fgetcsv , может быть какая-то другая функция, специфичная для моего проекта - в любом случае, если я не могу прочитать одну строку с моей функцией, которая читает сотни, это, вероятно, из-за проблемы в этой строке)
  • Затем проверьте количество полей
  • , затем, для каждого поля проверьте, содержит ли оно " допустимые " данные
    • обязательно? optionnal?
    • numeric?
    • string?
    • date?
    • и так далее
  • затем для каждого поля более тщательная проверка
    • для Например, для поля «код»: соответствует ли оно допустимому для моего приложения значению?

Если все идет нормально - ну, больше нечего делать, данные используют исключения; -) {{1} }
И когда вы закончите с одной строкой, просто повторите для следующей.


Конечно, если вы хотите принять или отклонить весь файл перед записью в любую базу данных (или что-то подобное) , вам придется:

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


В вашем конкретном случае у вас есть три вида полей:

Date;Id;Shown
15-Mar-10;231;345
15-Mar-10;232;346

Насколько я могу догадаться:

  • Первое должно быть датой
    • Использование некоторого регулярного выражения подтвердить, что это будет непросто: в каждом месяце не одинаковое количество дней, есть много месяцев, в феврале не одинаковое количество дней в зависимости от года, ...
    • В таком случае, Я бы, вероятно, попытался проанализировать дату с помощью чего-то вроде strtotime (хотя не уверен, что это подходит для используемого вами формата)
    • Или я бы просто взорвал строку { {1}}
      • убедитесь, что есть три части
      • , третья - 2 цифры
      • , вторая - одна из января , февраля , мар , ...
      • Что первый соответствует правильному количеству дней, в зависимости от двух других
  • Второй: {{1 }}
    • должно быть целым числом
    • должно быть допустимым значением, которое существует в вашей базе данных?
      • Если да, простой запрос SQL позволит y или проверить это
  • Что касается третьего, не совсем уверен ...
    • Полагаю, это должно быть целое число?
22
ответ дан 2 December 2019 в 07:02
поделиться

Я написал инструмент 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"

Любая строка, которая начинается с пустого столбца, может содержать любой текст, который вам нравится, и не будет обрабатываться во время проверки. Это полезно для заголовков, комментариев и т.д.

0
ответ дан 2 December 2019 в 07:02
поделиться

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

0
ответ дан 2 December 2019 в 07:02
поделиться

Ожидайте, что данные, которые вы читаете, действительны, и просто игнорируйте любые строки, которые кажутся недействительными или имеют неожиданный формат.

CSV используется для обмена данными или в качестве хранилища данных. Поэтому вполне вероятно, что он уже был "валидным", когда создавались файлы. Если вы - по какой-либо причине - имеете CSV-файл в качестве пользовательского ввода (единственный реальный источник, откуда могут прийти недействительные или неожиданные данные), нет никаких проблем с игнорированием этих данных и сообщением пользователю о недействительных строках.

0
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: