使用相同的转义字符和引号字符会破坏 CSV
Using Same Escape and Quote Character Breaks CSV
我有一个像这样的简单 CSV 文件:
SellerProductID;ProductTextLong
1000;"a ""good"" Product"
这是尝试使用 Apache CSV 读取它:
try (Reader reader = new StringReader(content)) {
CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withHeader().withEscape('"').withQuote('"');
CSVParser records = format.parse(reader);
System.out.println(records.iterator().next());
}
这不起作用,因为:
Exception in thread "main" java.lang.IllegalStateException: IOException reading next record: java.io.IOException: (startline 2) EOF reached before encapsulated token finished
at org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord(CSVParser.java:145)
at org.apache.commons.csv.CSVParser$CSVRecordIterator.next(CSVParser.java:171)
at org.apache.commons.csv.CSVParser$CSVRecordIterator.next(CSVParser.java:137)
Caused by: java.io.IOException: (startline 2) EOF reached before encapsulated token finished
at org.apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.java:288)
at org.apache.commons.csv.Lexer.nextToken(Lexer.java:158)
at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:674)
at org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord(CSVParser.java:142)
... 3 more
其他 CSV 工具(例如 Google 表格)可以很好地加载 CSV。
如果我使用另一个引号或转义字符,它会起作用,但遗憾的是客户的 CSV 已设置。
如何配置 Apache CSV 以允许相同的转义字符和引号字符?或者有什么方法可以修改流以即时替换引号字符(文件很大)?
我已经查看了您的问题,article and this post 可能会对您有所帮助。尝试与 .withNullString("")
.
一起使用
整个问题是 " 不是“转义字符”。
来自Wikipedia:
Embedded double quote characters may then be represented by a pair of consecutive double quotes, or by prefixing a double quote with an escape character such as a backslash.
所以在这种情况下,“”只是两个相邻的引号字符,而转义字符是用于转义引号或换行符或分隔符的不同字符。
这修复了它(请注意 withEscape()
的调用方式不同,但示例数据并未显示转义字符的实际含义):
try (Reader reader = new StringReader(content)) {
CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withHeader().withEscape('/').withQuote('"');
CSVParser records = format.parse(reader);
System.out.println(records.iterator().next());
}
我有一个像这样的简单 CSV 文件:
SellerProductID;ProductTextLong
1000;"a ""good"" Product"
这是尝试使用 Apache CSV 读取它:
try (Reader reader = new StringReader(content)) {
CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withHeader().withEscape('"').withQuote('"');
CSVParser records = format.parse(reader);
System.out.println(records.iterator().next());
}
这不起作用,因为:
Exception in thread "main" java.lang.IllegalStateException: IOException reading next record: java.io.IOException: (startline 2) EOF reached before encapsulated token finished
at org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord(CSVParser.java:145)
at org.apache.commons.csv.CSVParser$CSVRecordIterator.next(CSVParser.java:171)
at org.apache.commons.csv.CSVParser$CSVRecordIterator.next(CSVParser.java:137)
Caused by: java.io.IOException: (startline 2) EOF reached before encapsulated token finished
at org.apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.java:288)
at org.apache.commons.csv.Lexer.nextToken(Lexer.java:158)
at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:674)
at org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord(CSVParser.java:142)
... 3 more
其他 CSV 工具(例如 Google 表格)可以很好地加载 CSV。
如果我使用另一个引号或转义字符,它会起作用,但遗憾的是客户的 CSV 已设置。
如何配置 Apache CSV 以允许相同的转义字符和引号字符?或者有什么方法可以修改流以即时替换引号字符(文件很大)?
我已经查看了您的问题,article and this post 可能会对您有所帮助。尝试与 .withNullString("")
.
整个问题是 " 不是“转义字符”。
来自Wikipedia:
Embedded double quote characters may then be represented by a pair of consecutive double quotes, or by prefixing a double quote with an escape character such as a backslash.
所以在这种情况下,“”只是两个相邻的引号字符,而转义字符是用于转义引号或换行符或分隔符的不同字符。
这修复了它(请注意 withEscape()
的调用方式不同,但示例数据并未显示转义字符的实际含义):
try (Reader reader = new StringReader(content)) {
CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withHeader().withEscape('/').withQuote('"');
CSVParser records = format.parse(reader);
System.out.println(records.iterator().next());
}