Относительно синтаксического анализа файла CSV команды Java - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть CSV-файл в следующем формате. У меня возникает проблема, если одна из данных beow csv читается программой

«D», abc «def», «0429» 292 «0», «11», «IJ80», «Feb10_1.txt-2», «ЗАПИСЬ ФАЙЛА», «05.02.2010» "04/03/2010", "", "1", "- 91", "", ""


"D", "abc" def "," "," 04292920 "," 11 "," IJ80 "," Feb10_1.txt-2 "," RECORD FILE "," 05.02.2010 "," 04/03/2010" , "", "1", "- 91", "", ""

Приведенная ниже команда split используется для игнорирования запятых внутри двойных кавычек, которые я получил нижеприведенную команду split из предыдущего поста. Вставил URL, что я взял эту команду

Строковые элементы [] = line.split (", (? = ([^ \"] \ "[^ \"] \ ") [^ \"] $)», 15); System.out.println ( "items.length" + items.length);

Относительно синтаксического анализа Java-команды Split

item.length печатается как 14 вместо 15. abc "def не распознается как отдельное поле и неправильно хранится как "D", abc "def в items [0]. Я хочу, чтобы он сохранялся следующим образом

items [0] должно быть "D", а items [1] должно быть abc "def

Та же проблема возникает, когда есть значение "abc" def ". Я хочу, чтобы оно сохранялось как

items [0] должно быть "D", а items [1] должно быть "abc" def "

Также эта команда split работает отлично, если двойные кавычки повторяются внутри двойных кавычек (значение поля - D, "abc", "def", 1).

Как я могу решить эту проблему.

Ответы [ 4 ]

4 голосов
/ 17 февраля 2010

Я думаю, вам было бы гораздо лучше написать парсер для анализа CSV-файлов, чем пытаться использовать регулярное выражение. Как только вы начнете работать с CSV-файлами с возвратом каретки в строках, Regex, вероятно, распадется. Не потребовалось бы столько кода, чтобы написать простой цикл while, который прошел бы по всем символам и разделил данные. Было бы намного проще иметь дело с «нестандартными» * CSV-файлами, такими как ваши, когда у вас есть анализатор, а не Regex.

* Я говорю нестандартно, потому что на самом деле нет официального стандарта для CSV, и когда вы имеете дело с файлами CSV из разных систем, вы видите много странных вещей, таких как поле abc "def, как показано выше.

3 голосов
/ 17 февраля 2010

opencsv - отличный простой и легкий CSV-парсер для Java. Он легко обработает ваши данные.

0 голосов
/ 20 мая 2013

Opencsv - очень простой и лучший API для разбора CSV. Это можно сделать с помощью команд Linux SED перед обработкой в ​​Java. Если File не в правильном формате, преобразуйте его в правильный разделитель, который является вашим (",") в трубу или другой уникальный разделитель, так что значение поля и разделитель столбцов можно легко различить с помощью Opencsv. Используйте силу linux с вашим Java-кодом. ,

0 голосов
/ 17 февраля 2010

Если возможно, изменение формата CSV сделает решение очень простым.

Ниже приведен обзор разделенных значениями-разделителями, распространенного формата в системах на основе Unix:

http://www.faqs.org/docs/artu/ch05s02.html#id2901882

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...