具有字符串分隔符的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"
这种方法的缺点是你失去了忽略引号字符或转义分隔符的能力。
更新
而不是预处理数据,改变它的内容,为什么不在两步过程中结合上述两种方法:
编写自己的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