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

PNS*_*PNS 11 java csv delimiter separator

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

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

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

因此,如果有一个本地支持字符串分隔符的库,那将是很好的,因此不需要预处理.这意味着CSV现在标记为"CharSequence-Separated Values"数据.:-)

Mar*_*nor 5

这是一个很好的问题。这个问题对我来说并不明显,直到我查看了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"
Run Code Online (Sandbox Code Playgroud)

或者

    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"
Run Code Online (Sandbox Code Playgroud)

自己动手

使用 Java 字符串标记器方法。

    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"
Run Code Online (Sandbox Code Playgroud)

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

更新

与其预处理数据,改变其内容,不如将上述两种方法结合在一个两步过程中:

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

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