2016-09-15 7 views
2

Sample Data -Игнорировать двойные кавычки в полях при разборе файла CSV с помощью CSV анализатору

Header1, full_name, header3, header4

  1. 20, "боб, XXX", "тест", 30
  2. 20, "Evan" с, YYY», "тест", 30
  3. 20, "Том, ZZZ", "тест", 30

    CSVReader csvReader = new CSVReader(reader, ',', '"'); 
    

Вторая строка не читается так, как ожидалось. поскольку в значении столбца full_name есть двойная кавычка.

Я хочу игнорировать такие случаи. любое предложение было бы оценено.

использование openCSV java api для синтаксического анализа.

Edit:

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

+0

Возможный дубликат [CSV-парсер в JAVA, двойные кавычки в строке (SuperCSV, OpenCSV)] (http://stackoverflow.com/questions/23000676/csv-parser-in -java-double-quotes-in-string-supercsv-opencsv) – Etienne

+2

CSV искажен. См. Https://tools.ietf.org/html/rfc4180, Правило 7. Если для приложения полей используются двойные кавычки, то двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя ей другой двойной кавычкой. – Guenther

+0

Он не искажен, исходные данные имеют двойную кавычку внутри него. @Guenther – arun

ответ

1

univocity-parsers может обрабатывать неэкранированные кавычки и также в 4 раза быстрее, чем opencsv. Попробуйте этот код:

public static void main(String... args){ 
    String input = "" + 
      "20, \"bob, XXX\", \"test\", 30\n" + 
      "20, \"evan\"s,YYY \", \"test\", 30\n" + 
      "20, \"Tom, ZZZ\", \"test\", 30 "; 


    CsvParserSettings settings = new CsvParserSettings(); 

    CsvParser parser = new CsvParser(settings); 
    List<String[]> rows = parser.parseAll(new StringReader(input)); 

    //printing values enclosed in [ ] to make sure you are getting the expected result 
    for(String[] row : rows){ 
     for(String value : row){ 
      System.out.print("[" + value + "],"); 

     } 
     System.out.println(); 
    } 
} 

Это будет производить:

[20],[bob, XXX],[test],[30], 
[20],["evan"s],[YYY "],[test],[30], 
[20],[Tom, ZZZ],[test],[30], 

Кроме того, вы можете контролировать, как обрабатывать неэкранированные кавычки с одним из:

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_DELIMITER); 
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE); 
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR); 
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.SKIP_VALUE); 

При чтении больших файлов, вы можете используйте RowProcessor или выполните итерацию по каждой строке следующим образом:

parser.beginParsing(new File("/path/to/your.csv")); 

String[] row; 
while ((row = parser.parseNext()) != null) { 
    // process row 
} 

Отказ от ответственности: Я являюсь автором этой библиотеки. Он доступен с открытым исходным кодом и бесплатно (лицензия Apache 2.0)

+0

Ваше решение работает хорошо для небольших данных. Я имею дело с огромными тысячами строк и сотнями столбцов. это может увеличить время. Спасибо за предложение. – arun

+0

Есть много способов прочитать данные. Я только что привел пример. Вы можете читать файлы с триллионами строк и сотнями гигабайт с ним. Прочтите учебник, чтобы узнать больше. –

+0

Я обновил свой ответ, чтобы показать, как вы можете использовать библиотеку для обработки больших файлов. Файл 100mb с 3 миллионами строк занимает около 700 мс, чтобы полностью разбираться в моем macbook pro. Надеюсь, это поможет –