PNS*_*PNS 11 java csv delimiter separator
是否有任何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"
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)
这种方法的缺点是您无法忽略引号字符或转义分隔符。
与其预处理数据,改变其内容,不如将上述两种方法结合在一个两步过程中:
效率不高,但可能比编写自己的 CSV 解析器更容易 :-)