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

У меня есть CSV-файл в следующем формате.

H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,

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

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
System.out.println("items.length"+items.length);

Java: разделение запятой строки, но игнорирование запятых в кавычках

Когда я запускаю эти данные CSV, я получаю item.length, напечатанный как 8. Последние две запятые в конце строки после «NEW» игнорируются. Я хочу, чтобы команда split выбрала эти запятые и вернула мне длину 10. Она не собирает нулевые запятые, если она в конце, а поднимает ее, если она находится в середине строки. Не уверен, что мне нужно изменить в команде split, чтобы решить эту проблему. Также в файле csv двойные кавычки в содержимом текстового поля могут повторяться (например, «эта учетная запись является« большой »»)

Ответы [ 2 ]

9 голосов
/ 11 февраля 2010

Нет ничего плохого в регулярном выражении. Проблема в том, что split отбрасывает пустые совпадения в конце:

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

Обходной путь - предоставить аргумент, превышающий количество столбцов, которые вы ожидаете в своем CSV-файле:

 String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99);
0 голосов
/ 20 января 2012

Сегодня я столкнулся с этой же проблемой и нашел простое решение для CSV-файлов: добавление дополнительного поля, содержащего только один пробел во время выполнения разбиения:

(line + ", ").split(",");

Таким образом, независимо от того, сколько последовательных пустых полей может существовать в конце файла CSV, split () всегда будет возвращать n + 1 полей

Пример сеанса (с использованием bsh)

bsh % line = "H,\"TestItems_20100107.csv\",07/01/2010,20:00:00,\"TT1198\",\"MOBb\",\"AMD\",NEW,,
bsh % System.out.println(line);
H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,
bsh % String[] items = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
bsh % System.out.println(items.length);
8
bsh % items = (line + ", ").split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
bsh % System.out.println(items.length - 1 );
10
bsh %
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...