2017-08-04 34 views
1

私のプロジェクトのUnivocityパーサーを評価中です。固定幅フラットファイルフォーマットは3つの詳細レコードから1レコード(Bean)を作成しますAA、BB、CC) - このファイルはUnivocityを使用して解析できますか?
recordEndsOnNewlineを使用してカスタムのコンバージョンを読み込んで追加することはできますが、すぐに使用できるのはParserSettingsですか?Univocity - 1行(Bean)として3(n)行を解析する方法

AA1234 data 
BBmore data 
CCsome more data row 1 ended 
AA5678 data 
BBmore data 
CCsome more data row 2 ended 

更新:setLineSeparator("\nAA");

を使用することも?

答えて

1

ここに図書館の著者があります。まず、フィールドの位置を定義する必要があります。複数の行にある値を解析する場合は、recordEndsOnNewLinefalseに設定する必要があります。そうすれば正しい方向に向かいます。

それはどこ各レコードの開始「を参照してください」する方が簡単です、あなたは、単一のレコードを形成するラインに参加する場合は終了します。

String input = "" + 
    "AA1234 data\nBBmore data\nCCsome more data row 1 ended\n" + 
    "AA5678 data\nBBmore data\nCCsome more data row 2 ended"; 

あなたが提供した例を考えると、以下のフィールド構成を作成することができます(私は仮定

FixedWidthFields fields = new FixedWidthFields(); 
fields 
     .addField("a1", 2, 6) 
     .addField("a2", 7, 11) 
     .addField("b1", 14, 23) 
     .addField("c1", 26, 40) 
     .addField("c2", 41, 52); 

そして、あなたはこれで、あなたの入力を解析することができます:あなたは "AA"、 "BB" と "CC" の文字列を)したくない

FixedWidthParserSettings settings = new FixedWidthParserSettings(fields); 
settings.getFormat().setLineSeparator("\n"); 
settings.setRecordEndsOnNewline(false); 

FixedWidthParser parser = new FixedWidthParser(settings); 

List<String[]> rows = parser.parseAll(new StringReader(input)); 
for (String[] row : rows) { 
    System.out.println(Arrays.toString(row)); 
} 

これはあなたに正しい出力与える:

[1234, data, more data, some more data, row 1 ended] 
[5678, data, more data, some more data, row 2 ended] 

を今、私たちがどこ各フィールドの開始と終了を知っていることを、私たちはあなたのJava Beanを定義することができます。その準備をして

public static class Bean { 
    @FixedWidth(from = 2, to = 6) 
    @Parsed 
    int a1; 

    @FixedWidth(from = 7, to = 11) 
    @Parsed 
    String a2; 

    @FixedWidth(from = 14, to = 23) 
    @Parsed 
    String b1; 

    @FixedWidth(from = 26, to = 40) 
    @Parsed 
    String c1; 

    @FixedWidth(from = 41, to = 52) 
    @Parsed 
    String c2; 

    @Override 
    public String toString() { 
     return "Bean{" + 
       "a1=" + a1 + 
       ", a2='" + a2 + '\'' + 
       ", b1='" + b1 + '\'' + 
       ", c1='" + c1 + '\'' + 
       ", c2='" + c2 + '\'' + 
       '}'; 
    } 
} 

を、入力を解析することになりそのような出力に豆を印刷します

FixedWidthParserSettings settings = new FixedWidthParserSettings(); 
settings.getFormat().setLineSeparator("\n"); 
settings.setRecordEndsOnNewline(false); 
settings.setHeaderExtractionEnabled(false); // This one is important as your input has no headers. 

FixedWidthRoutines routines = new FixedWidthRoutines(settings); 
for(Bean bean : routines.parseAll(Bean.class, new StringReader(input))){ 
    System.out.println(bean); 
} 

そのような単純な
Bean{a1=1234, a2='data', b1='more data', c1='some more data', c2='row 1 ended'} 
Bean{a1=5678, a2='data', b1='more data', c1='some more data', c2='row 2 ended'} 

希望すると便利です。

関連する問題