【问题标题】:SuperCSV and DozerSuperCSV 和推土机
【发布时间】:2014-03-02 23:23:59
【问题描述】:

我正在开发一款软件,其中输入是 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.

【问题讨论】:

    标签: java supercsv


    【解决方案1】:

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

    如果每个客户映射到 CSV 文件中的 1 行,那么您应该能够像网站上的 examples 一样配置 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),则将新地址/车辆等复制到现有客户。

    或者,您可以尝试编写自己的单元处理器(如 here 所做的那样),或者看看 Dozer 的 iterate-method 功能是否有帮助。

    【讨论】:

    • 是的,我以同样的方式完成了它并开始工作,我需要编写自定义适配器。我的代码总是只从第 2 行读取。 ICsvDozerBeanReader beanReader = null; beanReader = new CsvDozerBeanReader(new FileReader("Test3.csv"), CsvPreference.STANDARD_PREFERENCE); beanReader.getHeader(true); // 忽略头文件 beanReader.configureBeanMapping(InsCsv.class, FIELD_MAPPING); InsuCsv 调查响应;而 ((surveyResponse =beanReader.read(InsuCsv.class, 处理器)) != null) { System.out.println(surveyResponse);} }
    • 知道了。我不应该做 --​​beanReader.getHeader(true);因为我的 csv 文件中没有标题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多