2010-02-17 2 views
0

У меня есть файл csv в нижнем формате. Я получаю сообщение, если какая-либо из данных cowv beow считывается программойЧто касается Java Split Command CSV File Parsing

«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 "," FILE RECORD "," 05/02/2010 "," 04/03/2010 "," "," 1 "," - 91 "," "," "

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

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

Regarding Java Split Command Parsing Csv File

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

Элементы [0] должны быть «D», а элементы [1] должны быть abc «def

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

пунктов [0] должно быть «D» и пункты [1] должны быть «а» DEF»

Кроме того, эта команда сплита отлично работает, если двойные кавычки повторяются внутри двойного кавычки (значение поля D, "ABC" "DEF", 1).

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

+1

Недействительные строки CSV. Котировку следует избегать. Я предлагаю вам написать простой небольшой парсер и отказаться от регулярного выражения. –

+0

Как я уже сказал в предыдущей теме: ** Не используйте регулярное выражение для разбора CSV. Это требует неприятностей. ** Это полная трата времени. См. Мой ответ: http://stackoverflow.com/questions/2241915/regarding-java-string-manipulation/2241950#2241950 О, пожалуйста, обратите внимание на * одну учетную запись пользователя здесь. – BalusC

ответ

0

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

См. Следующие сведения о разделительных значениях разделителя, общих широкоформатная на системах Unix на базе:

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

+0

Большое спасибо. Я планирую изменить формат файла, в котором каждое поле должно быть заключено в двойные кавычки, обязательно «A», «Field1», «Field2», «Field3», «Fi» el, d »,« Fi »" eld ", Я хочу, чтобы разделитель был объединен, т. е. был", (двойные кавычки, за которым следует) Как мне изменить команду split, чтобы включить два разделителя ", (двойная кавычка и запятая) вместе line.split (" (? = ([^ \ "] * \" [^ \ "] * \") * [^ \ "] * $)", 15); – Arav

4

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

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

+0

Большое спасибо. Я планирую изменить формат файла, в котором каждое поле должно быть заключено в двойные кавычки, обязательно «A», «Field1», «Field2», «Field3», «Fi» el, d »,« Fi »" eld ", Я хочу, чтобы разделитель был объединен, т. е. был", (двойные кавычки, за которым следует) Как мне изменить команду split, чтобы включить два разделителя ", (двойная кавычка и запятая) вместе line.split (" (? = ([^ \ "] * \" [^ \ "] * \") * [^ \ "] * $)", 15); – Arav

3

opencsv является большим простым и легким весом CSV парсером для Java. Это будет легко обрабатывать данные.

0

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