我的数据如下
ID1,ID2,FIRST_NAME,LAST_NAME,BIRTH_DATE,HA1,HA2,HA3,STATUS,DT
99,13863926H,MAL"COLMHS,ABBOT,1997-04-09,AMKC,RR,RR ,DE,
89,12973388H,"SAGAR,TARLE",ABDAT,1997-11-02,RNDC,RR,RR ,DE,
71,88JunkTest,Howdy,Doody,1985-11-02,RNDC,HA,HACLASSTYPE ,DE,2019-12-25
我正在尝试使用开放csv解析csv,在我的csv中,名字可以包含双引号(MAL"COLMHS"(或带逗号的双引号("SAGAR,TARLE"(或没有双引号的名字。
因此,使用.withIgnoreQuotations(true(,我可以解析第一行(MAL"COLMHS(,但无法找到解析第二行的解决方案。
我尝试了使用多个StackOverflow链接的解决方案,但未能解决它们。
我知道我的CSV文件不一致,但客户端的CSV文件中有太多这样的记录,很难手动使其一致,因此尝试搜索自动解决方案。
List<Results> beans = new CsvToBeanBuilder<Results>(new FileReader(file.getAbsolutePath()))
.withType(Results.class)
.withIgnoreQuotations(true)
.build().parse();
错误
java.lang.RuntimeException: Error parsing CSV line: 3. [3491903139,12973388H,SAGAR,TARLE,ABDAT,1997-11-02,RNDC,RR,RR ,DE,]
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:366)
at com.apds.partner.nycdoc.main.NycDocApplication.main(NycDocApplication.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: com.opencsv.exceptions.CsvRequiredFieldEmptyException: Number of data fields does not match number of headers.
at com.opencsv.bean.HeaderColumnNameMappingStrategy.verifyLineLength(HeaderColumnNameMappingStrategy.java:110)
at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:313)
at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:132)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:85)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
*****
编辑:我也尝试过SuperCSV,但同样的问题
我认为这里真正的问题是您的CSV文件不一致。
第一个数据行有10个字段,其中一个字段包含不平衡的双引号。
-
如果不忽略双引号,那么第一个数据行是不可解析的。
-
如果忽略双引号,那么第二个数据行有11个字段。
基本上,第一行格式错误。它应该这样说:
99,13863926H,"MAL""COLMHS",ABBOT,1997-04-09,AMKC,RR,RR ,DE,
我认为除了拒绝格式错误的输入之外,没有什么好的方法可以解决这个问题:
如果问题是坏数据,请让人修复(手工创建的(输入文件或从中提取输入文件的数据源。
如果问题出现在提取数据和生成CSV的程序中,则修复。
如果你真的想按原样解析这个输入,你需要手动实现你自己的CSV解析器来完成这项工作。OpenCSV不会处理这个输入,任何其他基于标准的解析器也不会。
您只是有一个格式错误的csv文件。根据RFC-4180,第2.5节
如果字段没有用双引号括起来,则双引号可能不会出现在字段内。
和第2.7节
如果使用双引号将字段括起来,则使用双引号出现在字段内部必须通过在其前面加上另一个字段来转义双引号。
我查过这个问题,试着用双引号替换所有的单双引号。不要忘记将所有字段都用双引号括起来。
在您的示例中,99,13863926H,"MAL""COLMHS",ABBOT,1997-04-09,AMKC,RR,RR ,DE,
应该起作用。
UPD:好吧,如果你不想手动编辑以使其符合RFC,我建议你对你的文件运行这个regex:^(?:d*,[^,]*,)([^"]w+(?:"w+)+)(?:,)
来检查有多少错误的记录。
您可能希望使用唯一的捕获组来提取格式错误的名称并正确地对其进行转义,然后将更改写回文件,并使用您选择的解析器重新读取。