Разбор вывода SELECT INTO OUTFILE

Я пытаюсь проанализировать вывод CSV команды SELECT INTO OUTFILE. (Цель — массовая загрузка данных во внешнюю базу данных NoSQL; для массовой загрузки требуется определенный формат файла, поэтому я пишу генератор)

Моя основная проблема заключается в обработке экранированных символов, в частности, символа FIELDS TERMINATED BY. MySQL, кажется, не избегает разделителя, когда он встречается в значении столбца.

Параметры экспорта моего запроса следующие:

FIELDS
    TERMINATED BY ','
    ENCLOSED BY '"'
    ESCAPED BY '\\'
LINES
    TERMINATED BY '\n'

Я получаю строки CSV, например:

"value1","some, value","another value","value3"

Это ломает мой синтаксический анализатор строк CSV, который просто разбивает строку, используя символ FIELDS TERMINATED BY.

т. е. мой парсер выдает следующие значения столбцов:

  • значение1
  • некоторые
  • значение
  • другое значение
  • значение3

"some" и "value" должны были быть проанализированы как целая строка "some, value"

Как правильно проанализировать вывод SELECT INTO OUTFILE?

Что-нибудь еще, о чем мне следует беспокоиться, учитывая указанные выше параметры экспорта? Мой код уже обрабатывает следующие случаи в значении столбца:

(в точном порядке)

  • Обрабатывать значение столбца \N как NULL
  • Заменить "

Примечание.

Если кто-нибудь может предоставить псевдокод MySQL LOAD DATA INFILE, это было бы здорово. Точное поведение этого оператора - это то, что я пытаюсь подражать.

Примечание.

Мой парсер написан на Java, но я гораздо лучше понимаю PHP


person PJ.    schedule 14.04.2014    source источник
comment
Если вы используете PHP, используйте fgetcsv с правильными параметрами. Если вы хотите сделать это вручную: правильный способ разбора - я думаю - очевиден, вам просто нужно его разобрать (читать посимвольно).   -  person Halcyon    schedule 14.04.2014
comment
Выглядит как хорошее совпадение (т.е. поддерживает корпус). Вы знаете эквивалент в Java?   -  person PJ.    schedule 14.04.2014


Ответы (1)


В итоге я использовал OpenCSV; хотя мне пришлось написать специальный обработчик для значения NULL, которое MySQL сбрасывает как «\N». К счастью, в моей схеме нет строкового поля, допускающего значение NULL, поэтому я могу с уверенностью предположить, что все вхождения "\N" являются NULL.

Спасибо @Doge за напоминание не изобретать велосипед :)

person PJ.    schedule 22.04.2014