是否有 Spring 函数可以删除 CSV 文件中的引号或分隔符?
Is there a Spring function that will remove a quote character or delimiter in a CSV file?
我正在阅读 Spring
中的一百万条记录文件,其中字段用 "
字符引用,分隔符是 |
字符。
示例:
"name1"|"name2"|"na"me3"|"name4"|....
我使用:
DelimitedLineTokenizer.setQuoteCharacter('"')
删除双引号字符,但name3
字段中的双引号没有正确处理。
问题 - 结果是:
Obj.name1 = name1
Obj.name2= name2
Obj.name3 = name3|name4
Obj.name4 = null
根据 CSV RFC 第 2.7 节,您的 CSV 文件无效。以下是规范的摘录:
If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote
如果您像 RFC 中提到的那样转义 "
,Spring Batch 将正确标记该行,这是 v4.2.2 的快速(通过)测试:
@Test
public void testSo61636078() {
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setDelimiter("|");
tokenizer.setQuoteCharacter('"');
FieldSet fieldSet = tokenizer.tokenize("\"name1\"|\"name2\"|\"na\"\"me3\"|\"name4\"");
assertEquals(4, fieldSet.getFieldCount());
assertEquals("name1", fieldSet.readString(0));
assertEquals("name2", fieldSet.readString(1));
assertEquals("na\"me3", fieldSet.readString(2));
assertEquals("name4", fieldSet.readString(3));
}
我正在阅读 Spring
中的一百万条记录文件,其中字段用 "
字符引用,分隔符是 |
字符。
示例:
"name1"|"name2"|"na"me3"|"name4"|....
我使用:
DelimitedLineTokenizer.setQuoteCharacter('"')
删除双引号字符,但name3
字段中的双引号没有正确处理。
问题 - 结果是:
Obj.name1 = name1
Obj.name2= name2
Obj.name3 = name3|name4
Obj.name4 = null
根据 CSV RFC 第 2.7 节,您的 CSV 文件无效。以下是规范的摘录:
If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote
如果您像 RFC 中提到的那样转义 "
,Spring Batch 将正确标记该行,这是 v4.2.2 的快速(通过)测试:
@Test
public void testSo61636078() {
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setDelimiter("|");
tokenizer.setQuoteCharacter('"');
FieldSet fieldSet = tokenizer.tokenize("\"name1\"|\"name2\"|\"na\"\"me3\"|\"name4\"");
assertEquals(4, fieldSet.getFieldCount());
assertEquals("name1", fieldSet.readString(0));
assertEquals("name2", fieldSet.readString(1));
assertEquals("na\"me3", fieldSet.readString(2));
assertEquals("name4", fieldSet.readString(3));
}