我正在构建一个软件,其中输入的是csv文件数据,它可以在单个文件中包含90k和行数据。
仅仅为了通知文件将根本没有标题行,它将从数据本身开始。
通过谷歌,我来到超级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.发布于 2014-03-03 03:55:56
没有标题是好的-只是要知道超级CSV配置将是静态的(即硬编码),因为您必须显式定义CSV的结构。请注意,您不需要调用beanReader.getHeader(),因为文件的第一行是数据,而不是头。
如果每个客户映射到CSV文件中的1行,那么您应该能够像在网站上的示例中一样配置超级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类以及列表。如果没有第二辆车雷戈,那么Dozer就不应该在车辆列表中填充第二个元素。
您会注意到,因为每个客户都映射到一行,所以可以使用索引映射,因为始终有固定数量的地址/车辆等。
如果每个客户跨多行,那么就不那么容易了。
在这种情况下,我可能会建议阅读每一行/客户,如果您找到相同的客户(即customerId),然后将新地址/车辆等复制到现有客户。
或者,您可以编写自己的单元处理器(如这里),也可以查看Dozer的迭代法功能是否有帮助。
https://stackoverflow.com/questions/22135091
复制相似问题