3

此外,允许以可读/简单的方式处理长行,在编写和读取它们时。

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

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

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

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

4

3 回答 3

6

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

然而,超级 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();
}

写法很相似。

于 2011-07-18T15:16:13.700 回答
3

您可以使用开源库uniVocity-parsers。有了这个库,您不仅可以随意选择列,还可以按任意顺序选择列。

带有以下标题:名称|编号|Color1|Color2......|Color67|

我们使用以下代码从 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 列的输出数据:

红色 蓝色 灰色
蓝色 黄色 白色

于 2015-05-14T14:50:21.230 回答
1

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

于 2011-07-18T15:11:34.293 回答