OpenCSV reader 去除结束引号而不是忽略它们
OpenCSV reader strips ending quotes instead of ignoring them
假设我有:
id,description,amount
1,Foo "bar",10.5
2,Quick "brown" fox,9.0
我知道正确的 csv 应该 Foo "bar"
转义为 Foo ""bar""
以提取引号。但这是我必须处理的数据 -- ,它不是我在处理之前可以修改的东西。
try (CSVReader csvReader = new CSVReaderBuilder(new FileReader(resourcePath))
.withSkipLines(1)
.withCSVParser(new CSVParserBuilder().withIgnoreQuotations(true).build())
.build()) {
String[] line;
..
为了解决这个问题,我尝试让 CSVReader 忽略所有带有 withIgnoreQuotations(true)
的引号,但它似乎去掉了最后一个引号而不是忽略它,所以输出以
结尾
1,Foo "bar,10.5
。有什么方法可以用 OpenCSV 实现以下目标吗?
1,Foo "bar",10.5
您可以使用如下内容:
new CSVParserBuilder().withQuoteChar('§').build();
显然这并不理想,因为您必须选择一个保证永远不会出现在您的数据中的字符。我选择了部分符号 §
- 这可能不适合你。
出于兴趣,Apache Commons CSV 解析器没有表现出这种行为:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
并且:
String sampleRecord = "1,Foo \"bar\",10.5";
CSVParser parser = CSVParser.parse(sampleRecord, CSVFormat.DEFAULT);
for (CSVRecord record : parser) {
System.out.println(record.get(1));
}
这会打印:
Foo "bar"
假设我有:
id,description,amount
1,Foo "bar",10.5
2,Quick "brown" fox,9.0
我知道正确的 csv 应该 Foo "bar"
转义为 Foo ""bar""
以提取引号。但这是我必须处理的数据 -- ,它不是我在处理之前可以修改的东西。
try (CSVReader csvReader = new CSVReaderBuilder(new FileReader(resourcePath))
.withSkipLines(1)
.withCSVParser(new CSVParserBuilder().withIgnoreQuotations(true).build())
.build()) {
String[] line;
..
为了解决这个问题,我尝试让 CSVReader 忽略所有带有 withIgnoreQuotations(true)
的引号,但它似乎去掉了最后一个引号而不是忽略它,所以输出以
1,Foo "bar,10.5
。有什么方法可以用 OpenCSV 实现以下目标吗?
1,Foo "bar",10.5
您可以使用如下内容:
new CSVParserBuilder().withQuoteChar('§').build();
显然这并不理想,因为您必须选择一个保证永远不会出现在您的数据中的字符。我选择了部分符号 §
- 这可能不适合你。
出于兴趣,Apache Commons CSV 解析器没有表现出这种行为:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
并且:
String sampleRecord = "1,Foo \"bar\",10.5";
CSVParser parser = CSVParser.parse(sampleRecord, CSVFormat.DEFAULT);
for (CSVRecord record : parser) {
System.out.println(record.get(1));
}
这会打印:
Foo "bar"