具有字符串分隔符的Java CSV分析器(多

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

根据定义,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字符串标记器方法。

    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"

这种方法的缺点是你失去了忽略引号字符或转义分隔符的能力。

更新

而不是预处理数据,改变它的内容,为什么不在两步过程中结合上述两种方法:

  • 使用“roll your own”来首先验证数据。 拆分每一行并证明它包含所需的字段数。
  • 使用“字段忽略”方法来解析验证的数据,确保已知指定了正确数量的字段。
  • 编写自己的CSV解析器效率不高,但可能更容易:-)


    尝试opencsv。

    它可以处理所有你需要的东西,包括(特别是)处理引用值中的嵌入分隔符(例如"a,b", "c"解析为["a,b", "c"]

    我已经成功地使用了它,并且我喜欢它。

    编辑:

    由于opencsv只处理单字符分隔符,因此可以解决此问题:

    String input;
    char someCharNotInInput = '|';
    String delimiter = "abc"; // or whatever
    input.replaceAll(delimiter, someCharNotInInput);
    new CSVReader(input, someCharNotInInput); // etc
    // Put it back into each value read
    value.replaceAll(someCharNotInInput, delimiter); // in case it's inside delimiters
    
    链接地址: http://www.djcxy.com/p/56931.html

    上一篇: Java CSV parser with string separator (multi

    下一篇: How to run telerik RadWindow from code behind