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

时间:2011-07-18 14:27:05

标签: java csv supercsv

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

我查看了opencsv,但它没有以任何顺序的方式引用行中的元素,而supercsv不允许按名称查找列,但仅限数字。

另一个警告 - 我需要能够按名称来处理列 - 是列的数量不是常量,并且只有部分列标题是常量,如:

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

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

3 个答案:

答案 0 :(得分:6)

我真的不能和opencsv说话,但如果你有固定数量的字段you might be able to use the JavaBean binding to do something like this

Super CSV但是,肯定支持使用CsvBeanReader,CsvDozerBeanReader或CsvMapReader(及其写作等价物)按名称读取和写入CSV行。

如果您希望保持简单并使用地图(列名称为键,列值作为值),则可以使用CsvMapReader。 Super CSV网站上有readingwriting的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();
}

写作非常相似。

答案 1 :(得分:3)

您可以使用开源库uniVocity-parsers。使用此库,您不仅可以根据需要选择列,还可以按任意顺序选择列。

使用以下标题: 名称|号码| COLOR1 | COLOR2 ...... | Color67 |

我们只选择列#34; Color1&#34;,&#34; Color3&#34;和&#34; Color2&#34;来自csv,代码如下:

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列的输出数据:

  

红蓝灰色
  蓝黄白色

答案 2 :(得分:1)

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