UniVocity CSV解析器的长度不一样?

时间:2016-02-22 21:53:04

标签: parsing csv

我有一个2600万行数据集,当我尝试用uniVocity解析器解析它时,它只读取1800万行。 我的行字段数从158到162不等,分隔符为ASCII'\ u0001'。

来自linux>>>>的wc -l输出wc -l withHeader.dat 26351323 withHeader.dat

但解析器将其读取为文件中的总行数= 18554088 (从parser.parseAll()的list.size输出)

有人可以解释可能出现的问题吗?

这是我的parserSettings

    settings.getFormat().setLineSeparator("\n");
    settings.selectFields("acctId","tcat", "transCode");
    settings.getFormat().setDelimiter('\u0001');
    //settings.setAutoConfigurationEnabled(true);
    //settings.setMaxColumns(86);
    settings.setHeaderExtractionEnabled(false);

    // creates a CSV parser
    CsvParser parser = new CsvParser(settings);
    // parses all rows in one go.
    List<String[]> allRows = parser.parseAll(newReader(filePath));
    System.out.println("Total # of rows in file = " + allRows.size());

1 个答案:

答案 0 :(得分:1)

如果您的值可以包含行分隔符,则解析的记录数不会等于行数。

如果情况并非如此,那么您可能无法正确配置格式。您可能需要配置引号,引用转义等。

我的第一个建议是尝试使用以下方法自动检测格式:

settings.detectFormatAutomatically();

解析后,检查您是否获得了预期的行数。您可以通过调用

来获取已检测到的内容
CsvFormat detectedFormat = parser.getDetectedFormat();

请记住,此过程不能保证有效,但在大多数情况下,它可以解决问题。这些功能从版本2.0.0开始提供。

如果没有任何帮助,请附上(部分)输入文件,以便我查看并更新我的答案。