2017-10-08 47 views
2

我有一个bean Person谁拥有“memberOf”的List。现在我想要的是,为每个“memberOf”条目编写一行这个bean(该项目需要它)。我所有的代码都写入了豆周围,但我有这个问题。例如:Univocity - 将列表属性写入多行

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时要这么做?

谢谢

回答

0

作者图书馆在这里。虽然图书馆不支持你想要做的事情,但使它工作起来相对容易 - 下面的例子有点儿低级,但会做你想做的事情。

基本上,你可以注释你的类的方法。使用它创建一个方法,每次调用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返回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 

希望它有帮助

+0

我喜欢解决方法。我没有考虑“每种方法”注释。非常感谢 – snap98