使用 Univocity Parsers Java 库实现快速灵活的 CSV 解析


Univocity Parsers是一个用 Java 编写的文件解析器库。它的性能令人难以置信,并为数据处理提供了方便的界面。据统计,它是最快的 CSV 解析器。
该库功能强大,并提供更多选项,例如 CSV 写入、自定义解析器设置等。要了解有关所有支持功能的更多信息。

点击标题见演示源码项目:
假设您在 CSV 文件中存储了多个服务配置属性。作为管理员用户,您希望通过 REST 端点检索服务数据。
data.csv:

SERVICE_ID,SERVICE_NAME,SERVICE_CASE,SERVICE_CLIENT 
1,SERVICE1,TEST1,CLIENT1 
2,SERVICE2,TEST2,CLIENT2 
12,SERVICE12,TEST12,CLIENT21

这个文件就像一个数据库,我们将查询它的信息。
请注意,该库还可以解析不同格式的文件,例如 TSV。

DTO:

package com.univocity.demo.dto;

import com.univocity.parsers.annotations.Parsed;
import lombok.Data;

@Data
public class CsvData {

    @Parsed(field = "SERVICE_ID")
    private String id;

    @Parsed(field =
"SERVICE_NAME")
    private String serviceName;

    @Parsed(field =
"SERVICE_CASE")
    private String serviceCase;

    @Parsed(field =
"SERVICE_CLIENT")
    private String serviceClient;
}
  • @Data :Lombok注解消除了模板代码(Getters, Setters, 等)。
  • UniVocity的@Parsed注解与Java Persistence的@Column注解相似。它与我们CSV文件中的列名相对应。

服务代码:

@Service
public class CsvDataService {

    private final HashMap<String, CsvData> dataMap = new HashMap<>();

    @PostConstruct
    private void populateDataMap() {
        BeanListProcessor<CsvData> rowProcessor = parseDataFromFile();
        for (CsvData data : rowProcessor.getBeans()) {
            dataMap.put(data.getId(), data);
        }
    }

    private BeanListProcessor<CsvData> parseDataFromFile() {
        InputStream is = getClass().getClassLoader().getResourceAsStream("data.csv");
        CsvParserSettings settings = new CsvParserSettings();
        BeanListProcessor<CsvData> rowProcessor = new BeanListProcessor<>(CsvData.class);
        settings.setHeaderExtractionEnabled(true);
        settings.setProcessor(rowProcessor);
        settings.selectFields(
"SERVICE_ID", "SERVICE_NAME", "SERVICE_CASE");
        CsvParser parser = new CsvParser(settings);
        parser.parseAllRecords(is);
        return rowProcessor;
    }

    public CsvData getDataById(String id) {
        return dataMap.get(id);
    }

    public List<CsvData> getAllData() {
        return new ArrayList<>(dataMap.values());
    }

}

这类似于使用Spring JPA从数据库中查询数据。但我们不希望每次收到请求时都要读取CSV文件。这个服务将像一个缓存。
  • 我们用CSV文件中的数据填充dataMap。这就是我们的缓存。
  • @PostConstruct注解保证了Bean将被完全初始化,并且我们可以使用必要的依赖关系。
  • parseDataFromFile方法从资源文件夹中读取文件。
  • 我们为CsvParser定义了一个CsvParserSettings配置类。
  • 我们添加了一个BeanListProcessor,它将所有从解析的输入中生成的Java对象存储到一个列表中。这样,我们就可以使用Getters轻松地访问数据。
  • 注意我们还指示CsvParserSettings使用selectFields方法来选择特定的字段。这意味着我们将不会加载我们不需要的字段。这也加快了进程。
  • getDataById和getAllData方法与JPA Repository方法类似。

 GitHub repository.