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

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

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

Теперь, что может «проверить, что это нормально» означает?

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

Если все идет хорошо – ну, не намного больше делать, кроме использования данных 😉
И когда вы закончите с одной строкой, просто переходите к следующему.

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

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

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

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

Из того, что я могу догадаться:

  • Первым должен быть дата
    • Использование некоторого регулярного выражения для проверки того, что будет непросто: не так же количество дней в месяц, есть много месяцев, в феврале нет такого же количества дней в зависимости от года, …
    • В таком случае я, вероятно, попытаюсь проанализировать дату с чем-то вроде strtotime (не уверен, что все в порядке для используемого вами формата)
    • Или я бы просто explode строку
      • убедившись, что есть три части
      • что третий – 2 цифры
      • что второй – один из Jan , Feb , Mar , …
      • То, что первое соответствует правильному количеству дней, в зависимости от двух других
  • Второй :
    • должен быть целым числом
    • должно быть допустимым значением, которое существует в вашей базе данных?
      • Если это так, простой SQL-запрос позволит вам проверить, что
  • Для третьего, не совсем уверен …
    • Я предполагаю, что это должно быть целое число?

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

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

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, если произошла ошибка.