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)
Возможный дубликат [CSV-парсер в JAVA, двойные кавычки в строке (SuperCSV, OpenCSV)] (http://stackoverflow.com/questions/23000676/csv-parser-in -java-double-quotes-in-string-supercsv-opencsv) – Etienne
CSV искажен. См. Https://tools.ietf.org/html/rfc4180, Правило 7. Если для приложения полей используются двойные кавычки, то двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя ей другой двойной кавычкой. – Guenther
Он не искажен, исходные данные имеют двойную кавычку внутри него. @Guenther – arun