it-swarm.com.ru

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

11
Rachel

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

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


Теперь, что может означать "убедиться, что все в порядке"?

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

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


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

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


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

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

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

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

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

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

0
poke

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

0
TLiebe

Я написал инструмент с открытым исходным кодом 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 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" в столбце "Пусто":

,"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
roskakori