gpt4 book ai didi

java - 当从文件的第一行读取时,有什么方法可以检索 cvsMapper 使用的 csvSchema 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:25 25 4
gpt4 key购买 nike

我设置了一个 CsvSchemaCsvMapper 来读取第一行包含列名称的 CSV 文件。

我需要能够对数据进行一些处理,更改特定字段,然后在保留列顺序的同时将数据写回。我假设 CsvMapper 具有从第一行创建的内部架构,因为映射具有所有正确的键值对。那么,有没有办法使用 CsvMapper 的 writer 函数来使用该架构来排序数据以进行输出?

CsvSchema schema = CsvSchema.emptySchema().withHeader();
CsvMapper mapper = new CsvMapper();
MappingIterator<Map<String, String>> it = this.mapper.readerFor(Map.class)
.with(this.schema)
.readValues(stream);

现在,我在第一列数据上收到“无法识别的列”的 CsvMappingException,因此看起来它没有使用架构。

最佳答案

您可以使用从输入文件读取的第一行中的架构构建SequenceWriter jackson 使用 LinkedHashMap后面,所以秩序得以维持。假设您的 CSV 输入包含:

C1,name,type
I1,John,T1
I2,Adam,T2

您可以读取、更新和写入控制台,如下例所示:

import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SequenceWriter;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.Map;

public class CsvApp {

private CsvMapper csvMapper = new CsvMapper();

private void handle() throws Exception {
File csvFile = new File("./resource/test.csv").getAbsoluteFile();

CsvSchema schema = CsvSchema.emptySchema().withHeader();
MappingIterator<Map<String, String>> iterator = csvMapper.readerFor(Map.class).with(schema).readValues(csvFile);

SequenceWriter writer = null;
while (iterator.hasNext()) {
final Map<String, String> row = iterator.next();
if (writer == null) {
writer = createWriter(row).writeValues(System.out);
}

// do something ...
for (Map.Entry<String, String> item : row.entrySet()) {
row.replace(item.getKey(), item.getValue() + "U");
}

// write back
writer.write(row);
}

close(writer);
}

private ObjectWriter createWriter(Map<String, String> row) {
CsvSchema.Builder writeSchema = new CsvSchema.Builder();
writeSchema.setUseHeader(true);
row.keySet().forEach(writeSchema::addColumn);

return csvMapper.writerFor(Map.class).with(writeSchema.build());
}

private void close(Closeable closeable) throws IOException {
if (closeable != null) {
closeable.close();
}
}

public static void main(String[] args) throws Exception {
new CsvApp().handle();
}
}

上面的代码打印:

C1,name,type
I1U,JohnU,T1U
I2U,AdamU,T2U

另请参阅:

  1. jackson-dataformats-text - Overview

关于java - 当从文件的第一行读取时,有什么方法可以检索 cvsMapper 使用的 csvSchema 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56228356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com