寻找一个允许按名称读取列的java CSV库

问题描述 投票:0回答:4

此外,还允许以可读/简单的方式处理长行,无论是写入还是读取。

我已经研究过

opencsv
但它并不以任何顺序方式引用行中的元素,并且
supercsv
不允许按名称查看列,而只能按数字查看。

另一个警告 - 我需要能够按名称寻址列 - 是列数不是恒定的,并且只有部分列标题是恒定的,例如:

Name|Number|Color1|Color2......|Color67|   

并非 1 到 67 之间的所有颜色都出现在任何给定的 CSV 文件中。

java csv supercsv
4个回答
6
投票

我无法真正与 opencsv 交谈,但如果您有固定数量的字段您也许可以使用 JavaBean 绑定来执行类似的操作

Super CSV 但是,绝对支持使用 CsvBeanReader、CsvDozerBeanReader 或 CsvMapReader(及其等效项)按名称读取和写入 CSV 行。

如果您希望保持简单并使用映射(以列名作为键,列值作为值),那么您可以使用CsvMapReader。 Super CSV 网站上有使用 CsvMapReader 进行阅读写作的示例。

阅读示例:

 ICsvMapReader mapReader = new CsvMapReader(
      new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
 try {
  final String[] headers = mapReader.getHeader(true);
  Map<String, String> row;
  while( (row = mapReader.read(headers)) != null) {
    for (String header : headers) {
      System.out.println(header + " is " + row.get(header));
    }
  }
} finally {
  mapReader.close();
}

写作非常相似。


3
投票

您可以使用开源库uniVocity-parsers。有了这个库,您不仅可以根据需要选择列,还可以以任何顺序选择列。

具有以下标题: 名称|编号|颜色1|颜色2......|颜色67|

我们使用以下代码从 csv 中仅选择“Color1”、“Color3”和“Color2”列:

public static void main(String[] args) throws FileNotFoundException {

    // 1st, config the CSV reader
    CsvParserSettings settings = new CsvParserSettings();
    settings.getFormat().setLineSeparator("\n");
    settings.selectFields("Color1", "Color3", "Color2");

    // 2nd, creates a CSV parser with the configs
    CsvParser parser = new CsvParser(settings);

    // 3rd, parses all rows of data in selected columns from the CSV file into a matrix
    List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv"));

    // 3rd, process the matrix with business logic
    for (String[] row : resolvedData) {
        StringBuilder strBuilder = new StringBuilder();
        for (String col : row) {
            strBuilder.append(col).append("\t");
        }
        System.out.println(strBuilder);
    }
}

您将获得这 3 列的输出数据:

红蓝灰
蓝黄白


1
投票

CsvReader 有一个

get()
方法来按名称读取列。不过,
CsvWriter
对应项无法写入命名列,因此它可能只能解决一半的问题。


0
投票

基本上我们有多种选择,我将分享其中2个:

选项 1:使用 (Apache Commons CSV)

  • mvn 依赖:
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.9.0</version>
</dependency>
  • 按名称列出的示例 CSV 读取器/解析器:
CSVFormat csvFormat = CSVFormat.DEFAULT
        .withDelimiter(separator)       // Set custom delimiter
        .withQuote(quoteChar)           // Set custom quote character
        .withFirstRecordAsHeader()      // Treat the first row as the header (after optional skipping)
        .withIgnoreEmptyLines()         // ignore empty lines
        ;

Reader reader = new FileReader(filepath);
CSVParser csvParser = new CSVParser(reader, csvFormat);

List<CSVRecord> records = csvParser.getRecords();
CSVRecord csvRecord1 = records.get(0);
String empolyeeName = csvRecord1.get("EmployeeName"); // reading column by name

选项 2:使用 (FastCSV)

<dependency>
    <groupId>de.siegmar</groupId>
    <artifactId>fastcsv</artifactId>
    <version>2.2.1</version>
</dependency>
  • 按名称列出的示例 CSV 读取器/解析器:
BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(filepath));

NamedCsvReader namedCsvReader = NamedCsvReader.builder()
        .fieldSeparator(separator)
        .quoteCharacter(quoteChar)
        .build(bufferedReader);

List<NamedCsvRow> namedCsvRowList = namedCsvReader.stream().collect(Collectors.toList());
NamedCsvRow namedCsvRow1 = namedCsvRowList.get(0);
String empolyeeName = namedCsvRow1.getField("EmployeeName"); // reading column by name
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.