使用 jackson-dataformat-csv 获取 csv 的标题

All*_*afe 4 java csv jackson

我使用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);
        }
Run Code Online (Sandbox Code Playgroud)

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

csvSchema._columns
Run Code Online (Sandbox Code Playgroud)

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

csvSchema.column(0)
Run Code Online (Sandbox Code Playgroud)

我得到错误:

Method threw 'java.lang.ArrayIndexOutOfBoundsException' exception.
Run Code Online (Sandbox Code Playgroud)

显然,列对象是空的。为什么?我如何从中获取列名数组CSV

Mic*_*ber 7

如果您需要列名,请将它们作为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());
Run Code Online (Sandbox Code Playgroud)


Hun*_*orn 5

字段是不是CsvSchema直到你从分析器MappingIterator

一个工作示例:

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