0

固定幅のフラット ファイルがあります。さらに悪いことに、各行は、各行の最初の文字によって識別される、新しいレコードまたは上の行のサブレコードのいずれかになります。

A0020SOME DESCRIPTION   MORE DESCRIPTION 922 2321      # Separate
A0021ANOTHER DESCRIPTIONMORE DESCRIPTION 23111442      # records
B0021ANOTHER DESCRIPTION   THIS TIME IN ANOTHER FORMAT # sub-record of record "0021"

固定幅データを解析するための優れたライブラリと思われるFlatwormを使用してみました。残念ながら、ドキュメントには次のように記載されています。

"Repeating segments are supported only for delimited files"

(同上、「繰り返しセグメント」)。

このためのカスタムパーサーを作成したくありません。(1) Flatworm でこれを行うことは可能ですか、または (2) そのような (複数行、複数サブレコード) 機能を提供するライブラリはありますか?

4

3 に答える 3

2

JRecordBind を見たことがありますか?

http://jrecordbind.org/

「JRecordBind は、階層的な固定長ファイルをサポートしています。つまり、他のレコード タイプの「息子」であるタイプのレコードです。」

于 2010-09-15T20:23:11.077 に答える
0

uniVocity-parsers を使用すると、固定幅の入力を読み取るだけでなく、マスター/ディテール行 (行にサブ行がある) も読み取ることができます。

次に例を示します。

//1st, use a RowProcessor for the "detail" rows.
ObjectRowListProcessor detailProcessor = new ObjectRowListProcessor();

//2nd, create MasterDetailProcessor to identify whether or not a row is the master row.
// the row placement argument indicates whether the master detail row occurs before or after a sequence of "detail" rows.
MasterDetailListProcessor masterRowProcessor = new MasterDetailListProcessor(RowPlacement.TOP, detailProcessor) {
    @Override
    protected boolean isMasterRecord(String[] row, ParsingContext context) {
        //Returns true if the parsed row is the master row.
        return row[0].startsWith("B");
    }
};

FixedWidthParserSettings parserSettings = new FixedWidthParserSettings(new FixedWidthFieldLengths(4, 5, 40, 40, 8));

// Set the RowProcessor to the masterRowProcessor.
parserSettings.setRowProcessor(masterRowProcessor);

FixedWidthParser parser = new FixedWidthParser(parserSettings);
parser.parse(new FileReader(yourFile));

// Here we get the MasterDetailRecord elements.
List<MasterDetailRecord> rows = masterRowProcessor.getRecords();
for(MasterDetailRecord masterRecord = rows){
 // The master record has one master row and multiple detail rows.
    Object[] masterRow = masterRecord.getMasterRow();
    List<Object[]> detailRows = masterRecord.getDetailRows();
}

開示:私はこのライブラリの作成者です。オープンソースで無料です (Apache V2.0 ライセンス)。

于 2014-11-23T08:24:27.093 に答える
0

プレオンを確認してください。Preon はビットストリーム圧縮データをターゲットにしていますが、その腕をひねって、特定したファイル形式にも使用できる可能性があります。Preon を使用する利点は、人間が読めるドキュメントも生成できることです。

于 2010-09-20T11:40:22.010 に答える