2013-07-17 3 views
0

У меня есть CSV-файл с 12 столбцами и прочитайте файл с классом CSVReader.CSVReader не может правильно прочитать строку

List<String[]> rows = reader.readAll(); 

Но я обнаружил, что некоторые строки [] имеют менее 12 элементов. Когда я отлаживался, я обнаружил, что это проблема текстового формата CSV.

Есть две проблемы:

  1. Некоторые столбцы заканчиваются символом обратной косой черты.

    Например, "Column A content\", "Column B content" будет рассматриваться как один столбец, так как \" рассматривается как символ эвакуации.

  2. В некоторых ячейках содержится \".

    Например, в одной строке, содержание колонка А является командная строка: "d -R u+rwX \""${MYTMP}\"" > /dev/null 2>&1; rm -fr \""${MYTMP}\"" >"

Так что я не могу думать о хорошей стратегии замены, чтобы справиться с этой проблемой формата. (например заменить все \ с \\, это работает для "contentA\","contentB" ситуации, но не работают на \" когда содержание ячейки)

Любые предложения? Также можно обсудить проблемы плохого форматирования и решения, которые вы испытывали в файлах CSV, чтобы Reader корректно читал.

ответ

1

Я думаю, что если вы замените \", на \\",, это решит вашу проблему. Скорее всего, командные строки Unix не содержат символ , сразу после \". Возможно, вам придется расширять его с помощью \", " до \\", " или, возможно, добавлять пробелы.

Особый случай будет, когда ваш последний столбец заканчивается, поэтому \"<nl> следует заменить на \\"<nl> где <nl> является независимо строкой разделителя у вас есть (\r\n, \r или \n)

+0

Спасибо, я попробую, чтобы узнать, не приведет ли это к другим ошибкам. –

0

Если у вас есть одна строки, как следующие:

"Column A content\","Column B content","d -R u+rwX \""${MYTMP}\"" > /dev/null 2>&1; rm -fr \""${MYTMP}\"" >" 

Попробуйте следующее:

CSVParser parser = new CSVParser(); 
String line = "\"Column A content\\\",\"Column B content\",\"d -R u+rwX \\\"\"${MYTMP}\\\"\" > /dev/null 2>&1; rm -fr \\\"\"${MYTMP}\\\"\" >\""; 
line = line.replaceAll("\\\\\"(?=,)", "\\\\\\\\\""); 
line = line.replaceAll("\\\\\"\"", "\\\\\""); 
String[] array = parser.parseLine(line); 
for (String str : array) { 
    System.out.println(str); 
} 

Выход:

Column A content\ 
Column B content 
d -R u+rwX "${MYTMP}" > /dev/null 2>&1; rm -fr "${MYTMP}" > 
Смежные вопросы