簡體   English   中英

Java Opencsv 解析 csv 與 csv 文件中的(名字中的雙引號)和(雙引號中的名字中的逗號)列

[英]Java Opencsv parse csv with (double quotes in first name) and (comma in double quoted first name) column in csv file

我有如下數據

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)或帶逗號的雙引號,TARLE(”)

所以 using.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 文件。 根據RFC-4180 ,第 2.5 節

如果字段沒有用雙引號括起來,則雙引號可能不會出現在字段內。

和第 2.7 節

如果使用雙引號將字段括起來,則出現在字段內的雙引號必須通過在其前面加上另一個雙引號來進行轉義。

我查了這個問題,嘗試用雙雙引號替換所有單雙引號。 並且不要忘記將所有字段包含在雙引號內。

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

UPD:好吧,如果您不想手動編輯以使其符合 RFC,我建議您運行此正則表達式^(?:\d*,[^,]*,)([^"]\w+(?:"\w+)+)(?:,)針對您的文件檢查有多少錯誤記錄。

您可能希望使用唯一的捕獲組來提取格式錯誤的名稱並將其正確轉義,然后將更改寫回文件並使用您選擇的解析器重新讀取它。

我認為這里真正的問題是您的 CSV 文件不符合要求。

第一個數據行有 10 個字段,其中一個包含不平衡的雙引號。

  • 如果不忽略雙引號,則第一行數據不可解析。

  • 如果您確實忽略了雙引號,那么第二個數據行有 11 個字段。

基本上,第一行格式錯誤。 應該這樣說:

 99,13863926H,"MAL""COLMHS",ABBOT,1997-04-09,AMKC,RR,RR  ,DE,

除了拒絕格式錯誤的輸入之外,我認為沒有解決此問題的好方法:

  • 如果問題是錯誤數據,請人修復(手工創建的)輸入文件或從中提取輸入文件的數據源。

  • 如果問題出在提取數據並生成 CSV 的程序中,請修復問題。

如果您真的想按原樣解析此輸入,則需要手動實現自己的 CSV 解析器來完成這項工作。 OpenCSV 不會處理這個輸入,任何其他基於標准的解析器也不會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM