使用 CSV 解析器解析 CSV 文件时忽略字段中的双引号
Ignore double quote in the fields when parsing a CSV file using CSV parser
示例数据 -
标题 1,full_name,标题 3,标题 4
- 20, "bob, XXX", "test", 30
- 20, "evan"s,YYY", "test", 30
20, "Tom, ZZZ", "test", 30
CSVReader csvReader = new CSVReader(reader, ',', '"');
第二行没有按预期读取。因为 full_name 列值中有一个双引号。
我想忽略这种情况。任何建议将不胜感激。
使用 openCSV java api 进行解析。
编辑:
我正在从数据库中获取数据。数据库列字段之一在其值中有一个双引号。因此,csv 数据看起来格式不正确。
univocity-parsers 可以处理未转义的引号,并且比 opencsv 快 4 倍。试试这个代码:
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 许可)
示例数据 -
标题 1,full_name,标题 3,标题 4
- 20, "bob, XXX", "test", 30
- 20, "evan"s,YYY", "test", 30
20, "Tom, ZZZ", "test", 30
CSVReader csvReader = new CSVReader(reader, ',', '"');
第二行没有按预期读取。因为 full_name 列值中有一个双引号。
我想忽略这种情况。任何建议将不胜感激。
使用 openCSV java api 进行解析。
编辑:
我正在从数据库中获取数据。数据库列字段之一在其值中有一个双引号。因此,csv 数据看起来格式不正确。
univocity-parsers 可以处理未转义的引号,并且比 opencsv 快 4 倍。试试这个代码:
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 许可)