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,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), но не могу найти решение для анализа 2-й строки.

Я пробовал решения с несколькими ссылками 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, но та же проблема


person stackUser    schedule 11.11.2019    source источник
comment
Вы должны опубликовать код, который вы пробовали, чтобы мы могли сказать, где не так.   -  person Sterconium    schedule 11.11.2019
comment
Пожалуйста, проверьте обновленный код   -  person stackUser    schedule 11.11.2019
comment
Таким образом, SAGAR,TARLE будет проанализирован до FIRST_NAME со значением как SAGAR,TARLE? Дайте мне знать, правильно ли я понимаю.   -  person hagarwal    schedule 11.11.2019
comment
Вам нужно исправить файл csv. Вы не можете игнорировать двойные кавычки и использовать их для одновременного заключения полей.   -  person Oleg    schedule 11.11.2019
comment
@hagarwal да, SAGAR,TARLE будут проанализированы как FIRST_NAME со значением SAGAR, TARLE или   -  person stackUser    schedule 11.11.2019
comment
Вероятно, этот пост stackoverflow.com/questions/41948442/ может вам помочь. Удачи!   -  person Dmitriy S    schedule 11.11.2019
comment
Кстати, я считаю, что лучшим решением было бы попросить вашего клиента предоставить правильно сформированный файл CSV. У вас будет на одну проблему меньше при работе с этим файлом, у клиента будет на одну ошибку меньше, а общий технический долг в мире немного уменьшится. :D   -  person Xobotun    schedule 11.11.2019


Ответы (2)


Я думаю, что настоящая проблема здесь в том, что ваш файл CSV не соответствует требованиям.

Первая строка данных имеет 10 полей, одно из которых содержит несбалансированную двойную кавычку.

  • Если вы не игнорируете двойные кавычки, то первая строка данных не поддается разбору.

  • Если вы игнорируете двойные кавычки, то во второй строке данных будет 11 полей.

В основном, первая строка искажена. Он должен сказать следующее:

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

Я не думаю, что есть хороший способ исправить это, кроме отклонения искаженного ввода:

  • Если проблема заключается в неверных данных, попросите человека исправить входной файл (созданный вручную) или источник данных, из которого извлечен входной файл.

  • Если проблема связана с программой, которая извлекает данные и создает CSV, исправьте это.

Если вы действительно хотите проанализировать этот ввод как есть, вам нужно будет вручную реализовать собственный анализатор CSV, чтобы выполнить эту работу. OpenCSV не будет обрабатывать этот ввод, как и любой другой парсер, основанный на стандартах.

person Stephen C    schedule 11.11.2019

У вас просто искаженный файл csv. Согласно RFC-4180, раздел 2.5.

Если поля не заключены в двойные кавычки, то двойные кавычки могут не появляться внутри полей.

и раздел 2.7

Если двойные кавычки используются для заключения полей, то двойные кавычки, появляющиеся внутри поля, должны быть экранированы, предваряя их другой двойной кавычкой.

Я просмотрел этот вопрос, попробуйте заменить все одиночные двойные кавычки с двойными двойными кавычками. И не забудьте заключить все поля в двойные кавычки.

В вашем примере 99,13863926H,"MAL""COLMHS",ABBOT,1997-04-09,AMKC,RR,RR ,DE, должно работать.

UPD: Хорошо, если вы не хотите редактировать вручную, чтобы сделать его совместимым с RFC, я предлагаю вам запустив это регулярное выражение: ^(?:\d*,[^,]*,)([^"]\w+(?:"\w+)+)(?:,) для вашего файла, чтобы проверить, сколько там неправильных записей.

Вы можете использовать единственную группу захвата, чтобы извлечь искаженное имя и правильно экранировать его, затем записать изменения обратно в файл и перечитать его с помощью анализатора по вашему выбору.

person Xobotun    schedule 11.11.2019