【问题标题】:Get header of csv using jackson-dataformat-csv使用 jackson-dataformat-csv 获取 csv 的标头
【发布时间】:2019-03-15 14:45:10
【问题描述】:

我使用jackson-dataformat-csv 库。我想解析CSV 文件。我有这个代码:

 CsvMapper csvMapper = new CsvMapper();
        CsvSchema csvSchema = csvMapper.typedSchemaFor(Map.class).withHeader();
        List<Map<String, String>> csvRows;
        try {
            MappingIterator<Map<String, String>> it = csvMapper.readerFor(Map.class)
                    .with(csvSchema.withColumnSeparator(';'))
                    .readValues(file.getInputStream());
            csvRows = it.readAll();
        } catch (Exception ex) {
            log.error("Unable to read csv document: ", ex);
        }

我想从此文件中获取列名。但我不明白如何制作它。我试试:

csvSchema._columns

但是,它是空对象。我也是这样做的:

csvSchema.column(0)

我得到错误:

Method threw 'java.lang.ArrayIndexOutOfBoundsException' exception.

很明显,columns 对象是空的。为什么?如何从CSV 获取列名数组?

【问题讨论】:

    标签: java csv jackson


    【解决方案1】:

    如果您需要列名,您可以将它们作为 Map 中的键,由 MappingIterator 返回:

    CsvMapper csvMapper = new CsvMapper();
    CsvSchema csvSchema = csvMapper.typedSchemaFor(Map.class).withHeader();
    
    MappingIterator<Map<String, String>> it = csvMapper.readerFor(Map.class)
            .with(csvSchema.withColumnSeparator(','))
            .readValues(csvFile);
    
    System.out.println("Column names: " + it.next().keySet());
    

    【讨论】:

      【解决方案2】:

      在您从MappingIterator 获取解析器之前,这些字段不在CsvSchema

      一个工作示例:

      CsvSchema schema = (CsvSchema) objectMappingIterator.getParser().getSchema();
              Iterator<CsvSchema.Column> iterator = schema.iterator();
              while (iterator.hasNext()) {
                  CsvSchema.Column next = iterator.next();
                  next.getName();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 2017-10-24
        • 2017-10-01
        • 2017-09-20
        • 2019-08-02
        相关资源
        最近更新 更多