Разбор многострочных файлов фиксированной ширины - PullRequest
0 голосов
/ 15 сентября 2010

У меня есть плоский файл фиксированной ширины.Что еще хуже, каждая строка может быть либо новой записью, либо подзаписью строки выше, идентифицируемой первым символом в каждой строке:

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) есть ли библиотека, обеспечивающая такие (многострочные, множественные суб-записи) возможности?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

Вы смотрели на JRecordBind?

http://jrecordbind.org/

"JRecordBind поддерживает иерархические файлы фиксированной длины: записи некоторого типа, которые являются" сыновьями "других типов записей."

0 голосов
/ 23 ноября 2014

С помощью 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).

0 голосов
/ 20 сентября 2010

Чек Преон . Хотя Preon нацелен на сжатые битовые данные, вы можете повернуть его руку и использовать для формата файлов, который вы определили. Преимущество использования Preon будет заключаться в том, что он будет генерировать удобочитаемую документацию.

...