是否有一个 Spring 函数可以删除 CSV 文件中的引号字符或分隔符?

Posted

技术标签:

【中文标题】是否有一个 Spring 函数可以删除 CSV 文件中的引号字符或分隔符?【英文标题】:Is there a Spring function that will remove a quote character or delimiter in a CSV file? 【发布时间】:2020-08-21 11:13:26 【问题描述】:

我正在读取Spring 中的一百万个记录文件,其中字段用" 字符引用,分隔符是| 字符。

例子:

"name1"|"name2"|"na"me3"|"name4"|....

我用:

DelimitedLineTokenizer.setQuoteCharacter('"')

删除双引号字符,但name3字段中的双引号未正确处理。

问题 - 结果是:

Obj.name1 = name1 
Obj.name2= name2
Obj.name3 = name3|name4 
Obj.name4 = null

【问题讨论】:

您好,请您尝试添加更多信息。代码示例 + 输入和输出以及预期输出。也请尝试使用代码格式 【参考方案1】:

根据CSV RFC,第 2.7 节,您的 CSV 文件无效。以下是规范的摘录:

如果使用双引号将字段括起来,则出现在字段内的双引号必须通过在其前面加上另一个双引号来进行转义

如果您按照 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));

【讨论】:

感谢 sn-p !马哈茂德。终于可以附上问题了!!

以上是关于是否有一个 Spring 函数可以删除 CSV 文件中的引号字符或分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Spring Batch 处理从 Web 应用程序上传的 Multipart CSV 文件?

是否可以直接从文件加载镶木地板?

删除多个 CSV 文件之间的重复项

是否可以在 s-s-rS 中嵌入 .Net 代码以从 CSV 文件中删除 CSV 标头,而不是更改报告服务器配置?

使用Python删除csv中的行[重复]

是否有一种简单或正确的方法来删除spring安全插件?