有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

此外,允许以可读/简单的方式处理长行,包括写入和读取

我已经研究了opencsv,但它不以任何顺序方式引用行中的元素,而且supercsv不允许按名称而仅按数字查看列

另一个警告——我需要能够通过名称对列进行寻址——是列的数量不是恒定的,只有部分列标题是恒定的,比如:

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

在任何给定的CSV文件中,并非所有介于1和67之间的颜色都存在


共 (3) 个答案

  1. # 1 楼答案

    您可以使用开源库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列的输出数据:

    red blue gray
    blue yellow white

  2. # 2 楼答案

    CsvReader有一个^{}方法按名称读取列。但是^{}对应项无法写入命名列,因此它可能只能解决一半的问题

  3. # 3 楼答案

    我不能真正与opencsv对话,但是如果您有固定数量的字段you might be able to use the JavaBean binding to do something like this

    Super CSV但是,绝对支持使用CsvBeanReader、CsvDozerBeanReader或CSVMaReader(以及它们的编写等价物)按名称读取和写入CSV行

    如果您希望保持简单并使用映射(以列名为键,以列值为值),那么您可以使用CsvMapReader。超级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();
    }
    

    写作很相似