Знание разделителей для файла CSV

Это может быть простой вопрос, но я не смог найти удовлетворительный ответ. Я пишу класс на Java, который должен принимать файл .csv, заполненный двойными значениями в трех столбцах. Очевидно, что файл .csv использует запятые в качестве разделителей, но когда я пытаюсь установить их с помощью своего сканера, сканер ничего не находит. Любой совет?

Scanner s = null;
try {
  s = new Scanner(source);
  //s.useDelimiter("[\\s,\r\n]+"); //This one works if I am using a .txt file
  //s.useDelimiter(", \n"); // This is what I thought would work for a .csv file
  ...
} catch (FileNotFoundException e) {
  System.err.format("FileNotFoundException: %s%s", e);
} catch (IOException e) {
  System.err.format("IOException: %s%n", e);
}

Пример ввода:

12.3 11.2 27.0

0.5 97.1 18.3

и Т. Д.

Спасибо за уделенное время!

РЕДАКТИРОВАТЬ: исправлено! Нашел правильные разделители и понял, что использую hasNextInt() вместо hasNextDouble(). /фейспалм


person A D    schedule 18.04.2011    source источник
comment
Можете ли вы предоставить примерную строку или две из вашего файла .csv?   -  person WhiteFang34    schedule 18.04.2011
comment
Конечно. добавлю к своему вопросу   -  person A D    schedule 18.04.2011
comment
Я не вижу запятых в ваших примерах ввода.   -  person Basil Bourque    schedule 30.03.2017


Ответы (4)


Рассмотрим следующее:

first,second,"the third",fourth,"the,fifth"

Должно быть только пять - последняя запятая находится в блоке кавычек, который не должен разделяться.

Не изобретайте велосипед. Существуют библиотеки с открытым исходным кодом для обработки этого поведения.

Быстрый поиск в Google дал http://opencsv.sourceforge.net/, и я уверен, что есть и другие.

person corsiKa    schedule 18.04.2011
comment
Спасибо. Я подумал, что будет проще закодировать его самому, потому что ввод всегда будет точно таким же. - person A D; 18.04.2011
comment
Apache Commons CSV – это хорошая библиотека, которая анализирует и создает различные форматы CSV, такие как а также файлы с разделителями табуляции. - person Basil Bourque; 30.03.2017

Если вы пытаетесь прочитать каждый отдельный элемент, попробуйте:

s.useDelimiter(",");

Тогда s.next() вернет элемент из CSV.

person Omar Estrella    schedule 18.04.2011

Почему у вас есть \n в разделителе CSV? В Java нет разницы между файлами CSV и TXT, если они имеют одинаковое содержимое.

Я думаю, ты бы хотел

s.useDelimiter(",");

or

s.useDelimiter("[\\s]+,[\\s\r\n]*");
person Brad    schedule 18.04.2011
comment
Я должен сказать, что предпочитаю ответ глоукодера своему собственному. Раньше у меня был самодельный парсер CSV в нашем приложении, и это доставляло мне много головной боли. - person Brad; 18.04.2011

Есть несколько методов обхода:

Метод 1: используйте условные операторы ( if-else / switch ) в расширении файла.

if(ext == 'csv') {
  s.useDelimiter(", \n");
} else if(ext == 'txt') {
  s.useDelimiter("[\\s,\r\n]+");
}

Метод 2: как и другие ответы, используйте это:

s.useDelimiter(",");
person Raptor    schedule 18.04.2011