8

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

 1 year ago
source link: https://www.jdon.com/63196
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用 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.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK