2016-08-19 23 views
2

Univocityパーサーを使用してCSVファイルを解析し、Beanに入力しています。Univocity CSVパーサーを使用して同じ定義を持ち、列数が異なる2つの異なるファイルを解析する

私が直面している問題は、2つの異なるファイルがあることです。両方のファイルの構造は同じですが、列数が異なります。両方とも同じBeanクラスを参照します。例えば

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

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

Beanクラスの定義は次のとおりです。私は両方のファイルに同じ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; 

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

、それは両方のファイルに同じ数の列を期待しているし、それは失敗しています。

私が使うことができる別のアプローチは、ファイルのセットごとに2つの異なる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; 

私はBeanクラスにtoString()メソッドを追加した後、次の出力を(GOT ):

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'} 

希望します。

関連する問題