CSVParser不处理未引用字符串中的转义定界符。

问题描述 投票:0回答:1

我在Java程序中使用com.opencsv.CSVParser (5.1)。

                    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"。 但相反,解析器在转义逗号处将字符串分割成两个字段,"String with " 和 " comma in it"。 withEscapeChar()的文档中说。

设置用于转义分隔符或引号的字符。

由于引号分隔符不需要转义,我以为(希望)这可以让我转义非引号字符串中的分隔符。 我已经尝试过使用和不使用withIgnoreQuotations。

我是否遗漏了什么,或者做错了什么?

java opencsv
1个回答
1
投票

我看不出你的代码有什么问题--但我也不能像预期的那样解析你的数据--我遇到了和你一样的问题。这感觉像是一个bug(这很令人惊讶)。如果不是bug,那么正确的用法对我来说太晦涩了。

另外,你也可以使用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

你可以改变你读取输入文件的方式 以适应你的特殊情况。

© www.soinside.com 2019 - 2024. All rights reserved.