Univocity - 将列表 属性 写入多行
Univocity - Writing a list property into multiple lines
我有一个 bean Person
,他的 List
为 "memberOf"。现在我想要的是,为 "memberOf" 的每个条目写一行这个 bean(项目需要它)。我所有的代码都是围绕 beans 编写的,但我遇到了这个问题。例如:
public class Person {
@Parsed(field = "USR_USERID")
private String uid;
@Parsed(field = "USR_NSUNIQUEID")
private String nsUniqueID;
@Parsed(field = "GROUP_NAME")
List<String>isMemberOf;
//-- Getters and Setters...
}
使用 CsvWriterSettings 和 BeanWriterProcessor 我在 csv 中得到的是这样的:
"uid","nsuniqueId","[memberOf1, memberOf2...]"
但我想要的是:
"uid","nsuniqueId","memberOf1"
"uid","nsuniqueId","memberOf2"
在使用 BeanWriterProcessor
时有什么方法可以做到这一点吗?
谢谢
这里是图书馆的作者。虽然该库不支持你想做的事情,但让它工作相对容易 - 下面的例子有点糟糕,但会做你想做的事。
基本上,您可以注释 class 的方法。使用它来创建一个方法,每次调用时 returns 都是 isMemberOf
的一个元素。例如:
private int groupNameIndex = 0;
@Parsed(field = "GROUP_NAME")
public String nextGroupName() {
if (hasMoreGroups()) {
return isMemberOf.get(groupNameIndex++);
}
return null;
}
public boolean hasMoreGroups() {
return isMemberOf != null && groupNameIndex < isMemberOf.size();
}
然后你可以一遍又一遍地写同一个bean,直到hasMoreGroups
returns false
:
while (person.hasMoreGroups()) {
writer.processRecord(person);
}
我用来测试的代码:
public static void main(String... args) {
Person person = new Person();
person.uid = "XYZ";
person.nsUniqueID = "abc";
person.isMemberOf.add("group1");
person.isMemberOf.add("group2");
person.isMemberOf.add("group3");
StringWriter out = new StringWriter();
CsvWriterSettings settings = new CsvWriterSettings();
settings.setHeaderWritingEnabled(true);
settings.setRowWriterProcessor(new BeanWriterProcessor<Person>(Person.class));
CsvWriter writer = new CsvWriter(out, settings);
while (person.hasMoreGroups()) {
writer.processRecord(person);
}
writer.close();
System.out.println(out.toString());
}
输出:
USR_USERID,USR_NSUNIQUEID,GROUP_NAME
XYZ,abc,group1
XYZ,abc,group2
XYZ,abc,group3
希望对您有所帮助
我有一个 bean Person
,他的 List
为 "memberOf"。现在我想要的是,为 "memberOf" 的每个条目写一行这个 bean(项目需要它)。我所有的代码都是围绕 beans 编写的,但我遇到了这个问题。例如:
public class Person {
@Parsed(field = "USR_USERID")
private String uid;
@Parsed(field = "USR_NSUNIQUEID")
private String nsUniqueID;
@Parsed(field = "GROUP_NAME")
List<String>isMemberOf;
//-- Getters and Setters...
}
使用 CsvWriterSettings 和 BeanWriterProcessor 我在 csv 中得到的是这样的:
"uid","nsuniqueId","[memberOf1, memberOf2...]"
但我想要的是:
"uid","nsuniqueId","memberOf1"
"uid","nsuniqueId","memberOf2"
在使用 BeanWriterProcessor
时有什么方法可以做到这一点吗?
谢谢
这里是图书馆的作者。虽然该库不支持你想做的事情,但让它工作相对容易 - 下面的例子有点糟糕,但会做你想做的事。
基本上,您可以注释 class 的方法。使用它来创建一个方法,每次调用时 returns 都是 isMemberOf
的一个元素。例如:
private int groupNameIndex = 0;
@Parsed(field = "GROUP_NAME")
public String nextGroupName() {
if (hasMoreGroups()) {
return isMemberOf.get(groupNameIndex++);
}
return null;
}
public boolean hasMoreGroups() {
return isMemberOf != null && groupNameIndex < isMemberOf.size();
}
然后你可以一遍又一遍地写同一个bean,直到hasMoreGroups
returns false
:
while (person.hasMoreGroups()) {
writer.processRecord(person);
}
我用来测试的代码:
public static void main(String... args) {
Person person = new Person();
person.uid = "XYZ";
person.nsUniqueID = "abc";
person.isMemberOf.add("group1");
person.isMemberOf.add("group2");
person.isMemberOf.add("group3");
StringWriter out = new StringWriter();
CsvWriterSettings settings = new CsvWriterSettings();
settings.setHeaderWritingEnabled(true);
settings.setRowWriterProcessor(new BeanWriterProcessor<Person>(Person.class));
CsvWriter writer = new CsvWriter(out, settings);
while (person.hasMoreGroups()) {
writer.processRecord(person);
}
writer.close();
System.out.println(out.toString());
}
输出:
USR_USERID,USR_NSUNIQUEID,GROUP_NAME
XYZ,abc,group1
XYZ,abc,group2
XYZ,abc,group3
希望对您有所帮助