0

我正在构建一个软件,其中输入是 csv 文件数据,它可以在单个文件中包含 90k 多行数据。

只是为了通知文件根本没有 HEADER 行,它将从数据本身开始。

通过谷歌搜索,我来到了超级 csv 和推土机映射器扩展。我无法找到一个示例,说明在读取单个 csv 行时可以用许多其他 pojo 的集合填充 Pojo。

我的客户 Pojo 看起来像下面的快照......

class CustomerPojo {

    private Id<CustomerId> customerId;

    private String lookupCode;

    // enum type  
    private QuoteType quoteType;

    private String bCovCa;
    private Money bCovRa;


    private String recommCovCa;
    private Money recommCoveRa;

    private Date insertedDate;

    private String pdfName;

    private List<VehicleInfo> vehicleInfoPojoList;

    private List<Address> addressList;

    // All setter-getter
}

有些人可以提供指导,我也在阅读该网站,但它有一些简单的例子,因为日常软件有多种关联和自定义数据类型。

Thanks in advance.
4

1 回答 1

1

没有标题是好的 - 请注意超级 CSV 配置将是静态的(即硬编码),因为您必须明确定义 CSV 的结构。请注意,您不需要调用 to beanReader.getHeader(),因为文件的第一行是数据,而不是标题。

如果每个客户映射到 CSV 文件中的 1 行,那么您应该能够以与网站上的示例相同的方式配置 Super CSV 。

例如,如果您的 CSV 如下所示:

1,1 First St,London,1 First Rd,New York,111AAA,111BBB
2,2 Second St,Paris,2 Second Rd,Munich,222AAA,222BBB

您的 bean 映射(基于您的 POJO)可能类似于:

new String[]{"customerId", "addressList[0].street", "addressList[0].city",   
    "addressList[1].street",  "addressList[1].city", 
    "vehicleInfoPojoList[0].rego", "vehicleInfoPojoList[1].rego"}

Dozer 将实例化必要的 VehicleInfo 和 Address 类以及列表。如果没有第二辆车 rego,那么 Dozer 不应填充车辆列表中的第二个元素。

您会注意到,因为每个客户都映射到一行,所以您可以使用索引映射,因为您将始终拥有固定数量的地址/车辆等。


如果每个客户跨越多行,那就没那么容易了。

在这种情况下,我可能会建议阅读每一行/客户,如果您找到相同的客户(即 customerId),则将新地址/车辆等复制到现有客户。

或者,您可以尝试编写自己的单元处理器(如此处所做),或者看看Dozer的迭代方法功能是否有帮助。

于 2014-03-03T03:55:56.130 回答