【问题标题】:mapping CSV file to POJO将 CSV 文件映射到 POJO
【发布时间】:2020-08-08 21:33:32
【问题描述】:

姓名、手机、城市、电子邮件

阿尔弗雷德,123566X,德里,abc@gmail.com

我有这个文件,它只有两行,第一行是标题行,第二行是值行。 文件 NAME 和 MOBILE 中只有两个文件是固定的,其他文件不固定,例如文件可能是 (NAME,MOBILE,PRODUCT) 或可能是 (NAME,MOBILE,SUMMURY,ABC,XYZ) 等。

我想将此文件映射到实体类

public class MyPojo{
    private String NAME;
    private int MOBILE;
    private ???
    
    //getter and setter
}

非常感谢任何帮助。 建议我任何解决方案我该怎么做。 请帮忙。提前致谢。编程世界的新手。

  File file=new File("file.csv");   
FileReader fr=new FileReader(file);   
BufferedReader br=new BufferedReader(fr);  
String [] line1 = br.readLine().split(",");
String [] line2 = br.readLine().split(",");

【问题讨论】:

  • 嗨莫妮卡!在 StackOverflow 上提问之前,您通常至少需要编写一些代码。尝试通过搜索“read file java”来查找教程,然后阅读 String 类的文档,如果您想从头开始。或搜索“java read csv”。要存储未知字段,请使用 HashMap。
  • 我可以读取文件并存储在字符串中,之后我不知道如何编写代码。请给我一个方法@GKFX
  • 试试这个链接,也许它会对你有所帮助。 Github
  • 如果不想使用任何外部依赖,可以看baeldung这个简单教程:baeldung.com/java-csv-file-array

标签: java json jackson gson


【解决方案1】:

为了简单起见,我假设实际数据中没有逗号。如果您想解析更通用的 CSV 文件,如果您没有信心完全从头开始解析,最好使用库。

您需要以逗号分隔每个字符串,因此请使用 String.split (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-)。阅读文档会告诉您为分隔符传递“正则表达式”。您可以阅读更多关于正则表达式here 的信息,但要仅匹配逗号,您可以使用文字逗号。

String header, data;
// Read file into the above strings
String[] headings = header.split(",");
String[] fields   = data.split(",");

现在你需要把它喂给你的班级。创建数据的 HashMap 并将其传递给 Pojo 的构造函数:

import java.util.HashMap;
import java.util.Map;
// Math.min selects the smaller of two values
int nItems = Math.min(headings.length, fields.length);
Map<String,String> map = new HashMap<String,String>(nItems);
// Start at the third item
for (int i = 2; i < nItems; i++) {
    map.put(headings[i], fields[i]);
}
Pojo pojo = new Pojo(fields[0], fields[1], map);

然后你只需要一个 Pojo 上的构造函数,它接受参数(String name, String mobile, Map&lt;String,String&gt; extraData)

class Pojo {
    String name, mobile;
    Map<String,String> extraData;
    public Pojo(String name, String mobile, Map<String,String> extraData) {
        this.name = name;
        this.mobile = mobile;
        this.extraData = new HashMap<String,String>(extraData);
    }
    // getters/setters....
}

【讨论】:

  • 感谢它的解决方案。但是,如果字段位置不同(电子邮件、姓名、城市、手机),您能否添加更多类似的内容,如何从 i=2 运行 for 循环。还有什么办法可以做到这一点@GKFX
  • @Monikaverma 您需要在 i=0 开始循环,以便所有内容都进入地图,然后从地图中检索并删除名称和移动设备,例如map.remove 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2016-10-20
相关资源
最近更新 更多