这是个好问题。在我查看了
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 String 分词器方法。
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解析器更容易:-)