gpt4 book ai didi

java - 使用 Smooks 读取 CSV

转载 作者:行者123 更新时间:2023-11-29 03:50:22 30 4
gpt4 key购买 nike

使用 Smooks (1.4) 读取 CSV 并将其转换为 Person POJO。

CSV 由每行以逗号分隔的记录组成,每条记录都有竖线分隔的字段:

Smith|John|45|male|Johnny|JSmith|JSmizzle,

Smith|Jane|43|female|Janey

等因此,每一行代表一个不同的人来创建。首先,一个 POJO:

public class Person
{
private String lastName;
private String firstName;
private int age;
private boolean isMale;
private List<String> aliases;
}

我的问题是别名的 List。以下是我的 XML 配置中的重要部分:

<reader class="org.milyn.csv.CSVReader">
<param name="fields">lastName,fristName,age,gender,aliases</param>
<param name="separator">&#124;</param>
<param name="strict">false</param>
</reader>

<core:filterSettings type="SAX"/>

<jb:bean beanId="person" class="net.me.myproject.app.Person" createOnElement="csv-set/csv-record/">
<jb:value property="lastName" data="csv-set/csv-record/lastName"/>
<jb:value property="firstName" data="csv-set/csv-record/firstName"/>
<jb:value property="isMale" data="csv-set/csv-record/gender"/>
<jb:value property="age" data="csv-set/csv-record/age"/>
<jb:wiring property="aliases" beanRefId="aliases"/>
</jb:bean>

<jb:bean beanId="aliases" class="java.util.ArrayList" createOnElement="???">
<jb:wiring beanRefId="alias"/>
</jb:bean>

<jb:bean beanId="alias" class="java.util.String" createOnElement="???">
???
</jb:bean>

所以让我感到窒息的是为 aliases ArrayList 以及每个 alias 字符串正确配置 createOnElement。在此先感谢任何可以将我推向正确方向的人!

最佳答案

首先,您的 CSVReader的“fields”属性将是 CSV 文件中包含的所有字段的大杂烩,无论它们映射回哪个 POJO、列表或类型。因此,一些字段将是 Person属性,一些字段将是实际上属于单独的 aliases 的别名bean,类型为 java.util.ArrayList<String> .

您的工作是告诉 Smooks 如何将每个字段映射到各自的 bean/list/component/type/etc,这意味着告诉它遇到每个字段时要做什么。

Smooks 不支持这种“动态”字段绑定(bind),您可以将 0+ CSV 字段映射回 ArrayList ,它本身将是空的或填充的。您必须枚举 CSVReader 中的每个字段,这意味着有一个 ArrayList具有固定大小的别名。

因此,您必须决定可以与每个 Person 关联的别名的最大数量,并在字段列表中说明它们:

<reader class="org.milyn.csv.CSVReader">
<param name="fields">lastName,fristName,age,gender,alias1,alias2,alias3</param>
<param name="separator">&#124;</param>
<param name="strict">false</param>
</reader>

这意味着每条 CSV 记录都必须具有您的 3 个别名的可信值。我建议使用“忽略”值,例如“%%%IGNORE%%%”,这样您的应用程序逻辑就无法删除包含该值的列表项(在 Smooks 完成转换后)。

您可能还想查看 Smooks 的内置 $ignore$ token ,它可能已经这样做或类似的事情。

在我们可以将所有内容组合成一个完整的代码示例之前的最后一步是简单地接受一个可悲的事实,即 Smooks 没有(或没有公开记录)任何使用 List<String> 的能力。在这种例子中。您必须将 POJO 转换为 List<StringBuffer> 才能使用或 List<StringBuilder>对于别名,这样我们就可以利用 Smooks-JavaBean value元素属性称为 setterMethod .

现在:

<jb:bean beanId="aliases" class="java.util.ArrayList" createOnElement="csv-set/csv-record">
<jb:wiring beanRefId="alias1"/>
<jb:wiring beanRefId="alias2"/>
<jb:wiring beanRefId="alias3"/>
</jb:bean>

<jb:bean beanId="alias1" class="java.util.StringBuffer" createOnElement="csv-set/csv-record/alias1">
<jb:value data="csv-set/csv-record/alias1" setterMethod="append" />
</jb:bean>

<jb:bean beanId="alias2" class="java.util.StringBuffer" createOnElement="csv-set/csv-record/alias2">
<jb:value data="csv-set/csv-record/alias2" setterMethod="append" />
</jb:bean>

<jb:bean beanId="alias3" class="java.util.StringBuffer" createOnElement="csv-set/csv-record/alias3">
<jb:value data="csv-set/csv-record/alias3" setterMethod="append" />
</jb:bean>

所以每次我们开始解析一个新的csv-record ,我们同时创建一个 person bean(如您的初始代码示例所示)以及 aliases bean 。然后,在解析这条记录的过程中,我们会发现 Person属性以及 alias1通过alias3 . aliasN字段存储到 aliases 中bean,同时另一个Person字段被存储到 person 中 bean 。最后,Smooks 知道“连接”person。和 aliases bean 一起创建一个 Java Person对象。

关于java - 使用 Smooks 读取 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039156/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com