当值使用逗号时,Csv Parser无法正确读取

时间:2018-03-21 11:58:36

标签: java apache opencsv

我必须解析CSV。我正在使用Apache常见的csv来做同样的事情。我的csv结构数据看起来像:

Name, ErrorType, Location,    Error Detail,                Mandatory
ABC , E1       , "XYZ\ABC",  "Valid Values: 'X','Y','Z'",  REQUIRED

我正在使用csv Parser的以下配置

CSVFormat.DEFAULT.withIgnoreSurroundingSpaces()                        
                 .withQuote(null).
                 .withHeader(excelHeaders)
                 .withFirstRecordAsHeader().parse(in).getRecords();

我必须使用withQuote(null)选项来避免错误

java.io.IOException: (line 27) invalid char between encapsulated token and delimiter
at org.apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.java:281)
at org.apache.commons.csv.Lexer.nextToken(Lexer.java:158)
at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:586)
at org.apache.commons.csv.CSVParser.getRecords(CSVParser.java:448)

每当我尝试读取Mandatory列的值时,它都会向我提供Error Detail列的详细信息。

有没有办法忽略引号内的逗号,我已经尝试过withEscape('“')。如果我使用它,我得到一个例外,即csv没有这个索引。

2 个答案:

答案 0 :(得分:0)

作为一种有点hacky解决方案,您可以预先“解析”CSV,例如使用正则表达式。

如果逗号位于引号内,您可以手动将逗号替换为其他字符。

但我认为有更好的选择来解决这个问题。但是,如果你只是需要一种快速的方法,那应该可行。

答案 1 :(得分:0)

如果删除withQuote会发生什么情况(默认情况下这是一个引用)

CSVFormat.DEFAULT.withIgnoreSurroundingSpaces()                        
                 .withHeader(excelHeaders)
                 .withFirstRecordAsHeader().parse(in).getRecords();

让我了解你的堆栈跟踪是因为如果你看一下actual apache commons csv code,你会看到获得此异常的唯一方法是将字符标识为引用字符然后它向前看并看到下一个字符不是引号(而不是分隔符或空格),因此它会抛出上述异常。所以这告诉我withQuote(null)不起作用 - 我认为你不想要,因为有些字符没有引号或你的解析器没有得到你的格式。