这是一个好问题。这个问题对我来说并不明显,直到我查看了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解析器更容易:-)