Я пытаюсь прочитать CSV-файл, разделенный запятыми, который выглядит следующим образом:
"Row ID","StringCol","idxCol"
"INDEX","object","float64"
"Row3","carriage return
carriage return",0.0
"Row4","new line
new line",1.0
"Row5","carriage return and new line
carriage return and new line",2.0
"Row10","",3.0
- Все строки заключены в кавычки "
- разделитель - запятая
- Окончание строки - возврат каретки + перевод строки
- разрывы строк {\ r или \ n) внутри кавычек должны оставаться нетронутыми
Следующий код не может правильно прочитать его:
CSVParser parser = new CSVParserBuilder()
.withEscapeChar(CSVParser.DEFAULT_ESCAPE_CHARACTER)
.withSeparator(CSVParser.DEFAULT_SEPARATOR)
.withQuoteChar(CSVParser.DEFAULT_QUOTE_CHARACTER)
.withStrictQuotes(false)
.build();
File tempFile = new File("test.csv");
try (BufferedReader br = Files.newBufferedReader(tempFile.toPath(), StandardCharsets.UTF_8);
CSVReader reader = new CSVReaderBuilder(br).withCSVParser(parser)
.withKeepCarriageReturn(true)
.build()) {
for(String[] line : reader) {
System.out.println(Arrays.toString(line));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Результат будет выглядеть так:
[Row ID, StringCol, idxCol"
]
[INDEX, object, float64"
]
[Row3, carriage return
carriage return, 0.0
]
[Row4, new line
new line, 1.0
]
[Row5, carriage return and new line
carriage return and new line, 2.0
]
[Row10, , 3.0
]
Как видите, если в конце строки есть кавычка перед возвратом каретки, она сохраняется как часть строки. Кажется, что \ r сохраняется как часть записи, хотя и не в кавычках. Это странное поведение, поскольку он игнорирует цитирование этой записи. Кроме того, он также сохраняет последний символ кавычки как часть string.
В принципе, я не вижу способа сохранить возврат каретки в кавычках, но все же смогу правильно прочитать последнюю запись (я бы не возражал удалить знак возврата каретки в конце строки, но я не могу всегда ожидаю т o раньше иметь кавычки. Или мне пришлось бы удалить оба с помощью регулярного выражения, ожидающего, по крайней мере, возврата каретки с необязательным символом кавычки перед концом строки, но у меня могут возникнуть проблемы, если это странное поведение изменится в будущем.