2016-08-19 58 views
2

我使用Univocity解析器解析CSV文件并将它们填充到Bean中。使用Univocity CSV解析器解析两个具有相同定义但列数不同的文件

我面临的问题是我有两个不同的文件。这两个文件结构相同,但列数不同。它们都引用相同的Bean类。

例如:

File A contains(without header): 
I|123|Hello 
U|345|Hi 

File B contains(without header): 
123|Hello 
345|Hi 

bean类的定义是:

public class Bean { 
    @Trim 
    @Parsed(index = 0) 
    protected String action; 

    @Trim 
    @Parsed(index = 1) 
    protected Long id; 

    @Trim 
    @Parsed(index = 2) 
    protected String name; 

    ...................... 
} 

如果我用这两个文件同一个bean,它期待在文件和两个相同的列数它失败了。

我认为我可以使用的另一种方法是针对不同的文件集有两个不同的bean,但是我正在查看Univocity分析器中是否有任何功能来处理这种情况。

请帮忙。谢谢。

+0

@JeronimoBackes ..你能帮忙吗? – Maverick

回答

2

您可以在解析每个输入之前“手动”设置标题。例如:

CsvParserSettings s = new CsvParserSettings(); 
    s.setHeaderExtractionEnabled(false); 
    CsvRoutines r = new CsvRoutines(s); 

    //set headers of input with 3 columns 
    s.setHeaders("action" , "id", "name"); 
    for(Bean b : r.iterate(Bean.class, new StringReader("I,123,Hello\nU,345,Hi"))){ 
     System.out.println(b); 
    } 

    //set headers of input with 2 columns 
    s.setHeaders("id", "name"); 
    for(Bean b : r.iterate(Bean.class, new StringReader("123,Hello\n345,Hi"))){ 
     System.out.println(b); 
    } 

如果你改变你的bean使用的头名,而不是列位置以上将工作:

public class Bean { 
    @Trim 
    @Parsed 
    protected String action; 

    @Trim 
    @Parsed 
    protected Long id; 

    @Trim 
    @Parsed 
    protected String name; 

我得到了下面的输出(加入toString()方法将Bean下课):

Bean{action='I', id=123, name='Hello'} 
Bean{action='U', id=345, name='Hi'} 
Bean{action='null', id=123, name='Hello'} 
Bean{action='null', id=345, name='Hi'} 

希望这有助于!

相关问题