gpt4 book ai didi

java - 如何映射两个文件中的键和值?

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

我四处搜寻,但找不到任何类似的问题,因此我发布了一个新问题。

目前我基本上有两个文件。一个文件是键的定义,另一个文件是映射到键的值(CSV 格式,但我不想限制它CSV 文件)。

文件1:

id:TEXT,名称:TEXT,城市:TEXT,州:TEXT,zip:Integer

它的意思是文件有5个字段,它定义了TEXT类型的idTEXT类型的nameInteger类型的zip等。

文件2(每条记录以换行符分隔,会有数千行记录):

11212,凯伦,纽约,纽约州,10000

21312,吉姆,波士顿,马萨诸塞州,10000

12312,,seattle,,10000//此记录中没有名称和州

因此文件 2 将具有映射到文件 1 中的键的值,请注意,如果该值为 null 或空,则在结果中它将被忽略。

将这些文件转换为 java 对象的元素方法如下:

@Data
@AllArgsConstructor
public class RecordCollection {
// Key is to map to the `id`, whereas the rest of the values map to Record
Map<String, Record> records;
}

@Data
@AllArgsConstructor
public class Record {
String name;
String city;
String state;
Integer zip;
}

首先我有:

String keyValues = "id:TEXT,name:TEXT,city:TEXT,state:TEXT,zip:Integer";

现在我已经解析了文件 2 的 inputStream,这就是我所在的位置:

BufferedReader file2InputStreamBuffered = new BufferedReader("文件 2");

现在,如何以优雅的方式将值映射到我的 Java 对象? (使用第 3 方工具或任何常见的库)

最佳答案

您需要构建CsvSchema为您的格式文件,然后使用它来读取 CSV文件。代码如下所示:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;

public class CsvApp {

public static void main(String[] args) throws Exception {
File formatFile = new File("./resource/test.format").getAbsoluteFile();
File csvFile = new File("./resource/test.csv").getAbsoluteFile();

CsvSchema schema = createSchemaForFormat(formatFile);

CsvMapper csvMapper = new CsvMapper();
MappingIterator<Record> rows = csvMapper.readerFor(Record.class).with(schema).readValues(csvFile);

RecordCollection recordCollection = new RecordCollection(100);
while (rows.hasNext()) {
recordCollection.add(rows.next());
}

recordCollection.getRecords().forEach((k, v) -> {
System.out.println(k + " => " + v);
});
}

private static CsvSchema createSchemaForFormat(File formatFile) throws IOException {
String content = String.join("", Files.readAllLines(formatFile.toPath()));
String[] columns = content.split(",");

CsvSchema.Builder builder = CsvSchema.builder();
for (String column : columns) {
String[] columnData = column.split(":");
String name = columnData[0];
String type = columnData[1];
builder.addColumn(name, "Integer".equalsIgnoreCase(type) ? CsvSchema.ColumnType.NUMBER : CsvSchema.ColumnType.STRING);
}

return builder.build();
}
}

class RecordCollection {

private final Map<String, Record> records;

RecordCollection(int expectedSize) {
this.records = new HashMap<>(expectedSize);
}

public void add(Record record) {
this.records.put(record.getId(), record);
}

public Map<String, Record> getRecords() {
return records;
}
}

class Record {

private final String id;
private final String name;
private final String city;
private final String state;
private final Integer zip;

@JsonCreator
public Record(
@JsonProperty("id") String id,
@JsonProperty("name") String name,
@JsonProperty("city") String city,
@JsonProperty("state") String state,
@JsonProperty("zip") Integer zip) {
this.id = id;
this.name = name;
this.city = city;
this.state = state;
this.zip = zip;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

public String getCity() {
return city;
}

public String getState() {
return state;
}

public Integer getZip() {
return zip;
}

@Override
public String toString() {
return "Record{" +
"name='" + name + '\'' +
", city='" + city + '\'' +
", state='" + state + '\'' +
", zip=" + zip +
'}';
}
}

上面的代码打印:

12312 => Record{name='     ', city='seattle ', state='  ', zip=10000}
21312 => Record{name='jim ', city='boston ', state='MA', zip=10000}
11212 => Record{name='karen', city='new york', state='NY', zip=10000}

在上述情况下Record类与定义列的配置文件相关联。如果格式为CSV不是动态的,您可以在Java中构建模式类而不从文件中读取它。如果是动态的,则代替Record您可以存储的类 Map<String, Object>可以处理动态列的类型。

有关更多信息,请查看 od Jackson CSV documentation .

关于java - 如何映射两个文件中的键和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57562887/

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