如何实现带有字符串分隔符的Java CSV解析器(多字符)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (538)

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

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

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

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

提问于
用户回答回答于

这些解决方案都不适合我,因为他们都假设您可以将整个CSV文件存储在内存中,以便进行简单的replaceAll类型操作。

我知道它很慢,但我一起去了Scanner。它具有惊人数量的功能,并使用您想要的任何字符串作为记录分隔符来滚动您自己的简单CSV阅读器。它还允许您解析非常大的CSV文件(之前我已经完成了10GB的单个文件),因为您可以一次读取一个记录。

Scanner s = new Scanner(inputStream, "UTF-8").useDelimiter(">|\n");

我更喜欢更快的解决方案,但我找不到支持它的库。自2017年初以来,FasterXML已经有一个开放的票据来添加这个功能:https//github.com/FasterXML/jackson-dataformats-text/issues/14

用户回答回答于

试试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

扫码关注云+社区

领取腾讯云代金券