在java中解析大型CSV文件的最快且有效的方法

Dav*_*vid 5 csv parsing opencsv java-8

我想尽可能快速高效地解析大型 CSV 文件。

目前,我正在使用 openCSV 库来解析我的 CSV 文件,但解析一个包含 10776 条记录和 24 个标题的 CSV 文件大约需要 10 秒,我想解析一个包含数百万条记录的 CSV 文件。

<dependency>
  <groupId>com.opencsv</groupId>
  <artifactId>opencsv</artifactId>
  <version>4.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我正在使用 openCSV 库使用下面的代码片段进行解析。

public List<?> convertStreamtoObject(InputStream inputStream, Class clazz) throws IOException {
        HeaderColumnNameMappingStrategy ms = new HeaderColumnNameMappingStrategy();
        ms.setType(clazz);
        Reader reader = new InputStreamReader(inputStream);

        CsvToBean cb = new CsvToBeanBuilder(reader)
                .withType(clazz)
                .withMappingStrategy(ms)
                .withSkipLines(0)
                .withSeparator('|')
                .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
                .withThrowExceptions(true)
                .build();
        List<?> parsedData = cb.parse();
        inputStream.close();
        reader.close();
        return parsedData;
    }
Run Code Online (Sandbox Code Playgroud)

我正在寻找另一种方法的建议,以在更短的时间内解析包含数百万条记录的 CSV 文件。

---更新了答案----

 Reader reader = new InputStreamReader(in);
        CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
                .withFirstRecordAsHeader()
                .withDelimiter('|')
                .withIgnoreHeaderCase()
                .withTrim());
        List<CSVRecord> recordList = csvParser.getRecords();
        for (CSVRecord csvRecord : recordList) {
             csvRecord.get("headername");
         }
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 0

回答

Reader reader = new InputStreamReader(in);
        CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
                .withFirstRecordAsHeader()
                .withDelimiter('|')
                .withIgnoreHeaderCase()
                .withTrim());
        List<CSVRecord> recordList = csvParser.getRecords();
        for (CSVRecord csvRecord : recordList) {
             csvRecord.get("headername");
         }
Run Code Online (Sandbox Code Playgroud)