gpt4 book ai didi

带有字符串分隔符(多字符)的 Java CSV 解析器

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:34 25 4
gpt4 key购买 nike

是否有任何 Java 开源库支持 CSV 的多字符(即,长度 > 1 的字符串)分隔符(定界符)?

根据定义,CSV = 以单个字符 (',') 作为分隔符的逗号分隔值数据。但是,存在许多其他单字符替代方案(例如制表符),使 CSV 代表“字符分隔值”数据(本质上是 DSV:定界符分隔值数据)。

CSV 的主要 Java 开源库(例如 OpenCSV)几乎支持任何字符作为分隔符,但不支持字符串(多字符)分隔符。因此,对于用“|||”之类的字符串分隔的数据除了预处理输入以将字符串转换为单字符定界符之外,别无选择。从那时起,数据可以被解析为单字符分隔值。

因此,如果有一个原生支持字符串分隔符的库就好了,这样就不需要预处理了。这意味着 CSV 现在代表“CharSequence-Separated Values”数据。 :-)

最佳答案

这是个好问题。在我查看 javadocs 之前,这个问题对我来说并不明显。并意识到 opencsv 只支持字符作为分隔符,而不支持字符串....

这里有一些建议的解决方法(Groovy 中的示例可以转换为 java)。

忽略隐式中间字段

继续使用 OpenCSV,但忽略空白字段。显然这是一种作弊,但它可以很好地解析行为良好的数据。

    CSVParser csv = new CSVParser((char)'|')

String[] result = csv.parseLine('J||Project report||"F, G, I"||1')

assert result[0] == "J"
assert result[2] == "Project report"
assert result[4] == "F, G, I"
assert result[6] == "1"

    CSVParser csv = new CSVParser((char)'|')

String[] result = csv.parseLine('J|||Project report|||"F, G, I"|||1')

assert result[0] == "J"
assert result[3] == "Project report"
assert result[6] == "F, G, I"
assert result[9] == "1"

自己动手

使用 Java 字符串 tokenizer方法。

    def result = 'J|||Project report|||"F, G, I"|||1'.tokenize('|||')

assert result[0] == "J"
assert result[1] == "Project report"
assert result[2] == "\"F, G, I\""
assert result[3] == "1"

这种方法的缺点是您无法忽略引号字符或转义分隔符..

更新

与其对数据进行预处理、更改其内容,不如将上述两种方法结合到一个两步过程中:

  1. 使用“自己动手”来首先验证数据。拆分每一行并证明它包含所需数量的字段。
  2. 使用“字段忽略”方法解析经过验证的数据,确保已指定正确数量的字段。

不是很有效,但可能比编写自己的 CSV 解析器更容易:-)

关于带有字符串分隔符(多字符)的 Java CSV 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8653797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com