Java Opencsv使用csv文件中的(名字中的双引号)和(名字中的双引号)来解析csv

我有以下数据

ID1,ID2,FIRST_NAME,LAST_NAME,BIRTH_DATE,HA1,HA2,HA3,STATUS,DT
99,13863926H,MAL"COLMHS,ABBOT,1997-04-09,AMKC,RR,DE,89,12973388H,"SAGAR,TARLE",AbdaT,1997-11-02,RNDC,71,88JunkTest,Howdy,Doody,1985-11-02,HA,HACLASSTYPE,2019-12-25

我正在尝试使用开放CSV解析csv,其中CSV中的名字可以包含双引号(MAL“ COLMHS)或带逗号的双引号(” SAGAR,TARLE“)或不带双引号的名字。 / p>

因此,使用.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,SAGAR,TARLE,]
    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,但是还是同样的问题

lingcy 回答:Java Opencsv使用csv文件中的(名字中的双引号)和(名字中的双引号)来解析csv

您只有格式错误的csv文件。根据{{​​3}},第2.5节

  

如果字段没有用双引号引起来,则双引号可能   没有出现在字段内。

和2.7节

  

如果使用双引号将字段括起来,则使用双引号   出现在字段中的内容必须先在另一个字段之前转义   双引号。

我已经查看了RFC-4180,请尝试将所有单双引号替换为双双引号。并且不要忘记将所有字段都用双引号引起来。

在您的示例中,99,13863926H,"MAL""COLMHS",ABBOT,1997-04-09,AMKC,RR,DE,应该可以工作。

UPD:好吧,如果您不想手动进行编辑以使其符合RFC,我建议您对文件this question^(?:\d*,[^,]*,)([^"]\w+(?:"\w+)+)(?:,)进行检查,以检查其中有多少错误的记录。

您可能希望使用唯一的捕获组来提取格式错误的名称并正确地对其进行转义,然后将所做的更改写回到文件中,并使用您选择的解析器重新读取它。

,

我认为这里的真正问题是您的CSV文件不符合要求。

第一行数据有10个字段,其中一个字段包含不平衡的双引号。

  • 如果您不忽略双引号,则第一条数据行不可解析。

  • 如果您确实忽略双引号,那么第二条数据行将包含11个字段。

基本上,第一行格式不正确。它应该这样说:

 99,

除了拒绝格式错误的输入外,我认为没有解决此问题的好方法:

  • 如果问题出在数据不好,请人工修复(手工创建的)输入文件或提取输入文件的数据源。

  • 如果问题出在提取数据并生成CSV的程序中,请修复那个

如果您真的想按原样解析此输入,则需要手工实现自己的CSV解析器以完成此工作。 OpenCSV不会处理此输入,其他任何基于标准的解析器也不会处理。

本文链接:https://www.f2er.com/3124801.html

大家都在问