OpenCSV - проблема CSVReader с keepCarriageReturn - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь прочитать 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 раньше иметь кавычки. Или мне пришлось бы удалить оба с помощью регулярного выражения, ожидающего, по крайней мере, возврата каретки с необязательным символом кавычки перед концом строки, но у меня могут возникнуть проблемы, если это странное поведение изменится в будущем.

...