【问题标题】:csv to pojo with another pojocsv 到 pojo 与另一个 pojo
【发布时间】:2013-05-03 15:59:22
【问题描述】:
Orgnization{

private String name;
private String uniqueId;
private boolean selfRegEnabled;
private List<Address> addrList;

public void setAddress(Address a){..}
public void setName(String name){..}

}

Addess{
private String type;
private String line1;
private String line2;
private String line3;
private String city;
private String state;
private String zip;
private String country;
}

CSV 标题列如下

System.UniqueID,Name,EnableSelf-Registration,Addr1.Type,Addr1.Line1,Addr1.Line2,Addr1.Line3,Addr1.City,Addr1.State,Addr1.Zip,Addr1.Country,Addr2.Type,Addr2 .Line1,Addr2.Line2,Addr2.Line3,Addr2.City,Addr2.State,Addr2.Zip,Addr2.Country,Addr3.Type,Addr3.Line1,Addr3.Line2,Addr3.Line3,Addr3.City,Addr3.State ,Addr3.Zip,Addr3.Country

我的问题可能与以下链接有关

OpenCSV CSV to JavaBean

我没有看到该线程有正确的答案(我不确定我是否错过了该线程的任何答案)

我们可以使用任何现有的 csv 库(例如 supercsv、opencsv)实现相同的功能吗?

如果我使用的是 supercsv - 我可以将 csv 的 System.UniqueID 列映射到我的 bean 的 systemUniqueID 属性

【问题讨论】:

    标签: opencsv supercsv


    【解决方案1】:

    您当然可以使用 CsvDozerBeanReader 使用 Super CSV 执行此操作。在网站上看到这个example

    this SO answer上也有更详细的解释。

    您可能还对this 最近的问题感兴趣,因为它演示了使用 Super CSV(使用和不使用 Dozer)实现深度/索引映射的不同方法。

    按照网站上的 CsvDozerBeanReader 示例,要从您的问题中读取 CSV,您将使用以下字段映射:

    final String[] fieldMapping = new String[]{
        "uniqueId",
        "name",
        "selfRegEnabled",
        "addrList[0].type",
        "addrList[0].line1",
        "addrList[0].line2",
        "addrList[0].line3",
        "addrList[0].city",
        "addrList[0].state",
        "addrList[0].zip",
        "addrList[0].country",
        "addrList[1].type",
        "addrList[1].line1",
        "addrList[1].line2",
        "addrList[1].line3",
        "addrList[1].city",
        "addrList[1].state",
        "addrList[1].zip",
        "addrList[1].country",
        "addrList[2].type",
        "addrList[2].line1",
        "addrList[2].line2",
        "addrList[2].line3",
        "addrList[2].city",
        "addrList[2].state",
        "addrList[2].zip",
        "addrList[2].country"
    };
    

    此外,由于 selfRegEnabled 字段是布尔值,您需要使用 cell processors 将字符串值转换为布尔值 - 为此,您需要使用 ParseBool 处理器。

    【讨论】:

    • 浏览您的网站后我确实知道了。感谢您的回答 - 这真的很有帮助。一个简单的问题实际上是通过 selfRegEnabled 列的 csv 记录我得到的是/否 - 如何直接映射到我的 bean 中的布尔值?
    • 您必须使用 ParseBool 单元处理器,即 new ParseBool("Yes","No) 用于 selfRegEnabled 列。如果这是唯一需要处理的列,那么您只需创建处理器阵列 (CellProcessor[] processors = new CellProcessor[fieldMapping.length]),然后设置该列 (processors[2] = new ParseBool("Yes","No"))。有关详细信息,请参阅网站上的示例。
    • 一旦获得所需的声誉,我会选择正确的 :)。还有一个问题,我想验证整个 csv 记录以用于记录目的,因为我必须将无效记录写入新的 csv 文件。假设我有 50 列的 csv 记录 - 我需要验证它们,如果某些列无效,我需要放置自定义消息(应该对所有无效列进行聚合)并将其添加回具有实际数据的新 csv 文件 +例外的新列
    • @JamesBassett 我面临同样的问题,但我对此有疑问。当我的 csv 文件包含大型数据集时,如何实现这一点?我应该根据索引编写所有列名吗?有没有最简单的方法?
    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多