CSVParser не обрабатывает экранированные разделители в строках без кавычек - PullRequest
0 голосов
/ 02 мая 2020

Я использую com.opencsv.CSVParser (5.1) в моей программе Java.

                    final CSVParser csvParser =
                        new CSVParserBuilder()
                        .withSeparator(',')
                        .withQuoteChar('"')
                        .withEscapeChar('\\')
                        .withIgnoreQuotations(true)
                        .build();

Мой входной файл имеет

3,2.48,E #3,String with \, comma in it,0

Я ожидал 4-го поля в итоге "Строка с запятой в нем". Но вместо этого парсер разбивает строку на две поля через экранированную запятую с помощью «String with» и «comma in it». Документация для withEscapeChar () гласит:

Устанавливает символ, который будет использоваться для экранирования разделителя или кавычки.

И поскольку разделители в кавычках не нужно экранировать, Я предположил (надеялся), что это позволит мне избежать разделителей в строках без кавычек. Я пробовал это как с, так и без с помощью IgnoreQuotations.

Я что-то упустил или сделал что-то не так?

1 Ответ

1 голос
/ 02 мая 2020

Я не вижу ничего плохого в вашем коде - но я также не могу проанализировать ваши данные, как ожидалось - я столкнулся с той же проблемой, что и вы. Это похоже на ошибку (что удивительно). И если это не ошибка, то правильное использование слишком неясное для меня.

В качестве альтернативы вы можете использовать Commons CSV:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.8</version>
</dependency>

Пример кода:

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;

...

private void commonsCsvTest() throws URISyntaxException, IOException {
    Path path = Paths.get(ClassLoader.getSystemResource("csv/escapes.csv").toURI());
    Reader in = new FileReader(path.toString());
    Iterable<CSVRecord> records = CSVFormat.DEFAULT.withEscape('\\').parse(in);
    for (CSVRecord record : records) {
        System.out.println(record.get(3));
    }
}

Используя ваши данные во входном файле "escapes.csv", мы получаем следующий вывод:

String with , comma in it

Очевидно, что вы можете изменить способ чтения входного файла, чтобы он соответствовал вашей конкретной ситуации c.

...