Обработка файлов CSV с помощью Delphi

Я получил CSV-файл, предположительно, с семью столбцами, и до недавнего времени у меня все было хорошо, они начали использовать запятые в третьем столбце данных, а также символы CR и LF, также в третьем столбце, все это между двойными кавычками,

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

Например:

  1. 1,4778,"El murciélago estaba navegando",10/08/2010,906610,13496-86219-1,1, Этот работает просто отлично.

  2. 1,4778,"El murciélago estaba navegando,
    y además estaba de parranda",10/08/2010,906610,13496-86219-1,1
    , Теперь это плохо.

В любом случае вы предлагаете решить эту проблему? Третий столбец данных ВСЕГДА тот, с этими внезапными изменениями. Остальные никогда не будут работать с новыми строками или дополнительными запятыми, поэтому нет необходимости фильтровать их...

Заранее спасибо!

2 ответа

Решение

Вероятно, самый чистый, самый систематический способ справиться с этим - это читать символ за символом и использовать небольшой конечный автомат, чтобы иметь дело с такими вещами, как "мы внутри строки в кавычках, поэтому игнорируйте запятую, CR или LF".

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

Итак, вы начинаете в состоянии Start. В состоянии Start, если вы видите цитату, вы переходите в состояние QuotedField. Если вы видите букву или цифру, вы переходите в состояние UnQuotedField. Если вы видите запятую, вы переходите в состояние EndField (то есть вы просто читаете пустое поле). Если вы видите что-то еще, вы переходите в состояние ошибки.

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

Это почти неизвестно, но BDE может читать файлы CSV - ему просто нужен файл определения, чтобы сказать, в каком формате это файл. Как использовать это в документации BDE.

Другие вопросы по тегам