我在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。
我是否遗漏了什么,或者做错了什么?
我看不出你的代码有什么问题--但我也不能像预期的那样解析你的数据--我遇到了和你一样的问题。这感觉像是一个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
你可以改变你读取输入文件的方式 以适应你的特殊情况。