Тактика разбора текстового журнала фиксированной ширины в Java - PullRequest
2 голосов
/ 20 сентября 2011

Я пытаюсь выяснить, как лучше всего проанализировать следующий файл журнала, разбивая каждый раздел, разделенный горизонтальными линиями, и извлекая различные фрагменты данных, например, «COMPANY123», «BIMMU», дату (2/18 и т. Д..), а затем создайте строку, содержащую все остальные данные, содержащиеся в разделе, разделенном горизонтальными линиями.

Т.е. я хочу создать массив объектов 'Statement', каждый со следующими атрибутами:

Company name, Account, Date, Data.

Например, для второй записи ниже,

Account = 'BIMMU'
Firm = 'Super Corporation'
Date= 9/14/11
Data = '* * * * * * * * TODAYS ACCOUNT ACTIVITY * * * * * * * * * * *
        9/14/11 Y9 CALL OESX OCT 11 ........ etc'

Журнал представляет собой текстовый файл фиксированной ширины, и переменные (дата и т. Д.) Всегда находятся в одной и той же позиции в строке,например, sSalesCode = line.substring(142, 147);

Должен ли я сделать это в два прохода, например, разделить код на разделы, разделенные горизонтальной линией, а затем проанализировать эти разделы по отдельности?

Просто написать это здесьпомог мне получить ход мыслей, но если у кого-то есть какие-нибудь умные идеи, было бы здорово услышать их.


------------------------------------------------------------------------------------------------------------------------------------F   BIASPBIMMU
BIMMU    BIASP-COMPANY123 KG              (Z )  9/14/11  EU (T-  I- )                      MT-0                              F   BIASP²BIMMU
CALLS     2/18  YI              50.00-X (49)                                                                                        F   BIASP²BIMMU
------------------------------------------------------------------------------------------------------------------------------------F   BIASPBIMMU
BIMMU    BIMM2-SUPER CORPORATION KG              (Z )  9/14/11  EU (T-  I- )                      MT-0                              F   BIMM2²BIMMU
                                                                                                                                    F   BIMM2²BIMMU
* * * * * * * * * * * * * * * * * * *     T O D A Y S    A C C O U N T    A C T I V I T Y    * * * * * * * * * * * * * * * * * * * *F   BIMM2²BIMMU
 9/14/11        Y9             500   GO  CALL OESX   OCT 11  2400            9.60    EU                                        .00  F   BIMM2²BIMMU
                                                              GO-PARFSecurities Ser                                                 F   BIMM2²BIMMU
                Y9        *    500 *     COMMISSIONS                                 EU                                     250.00- F   BIMM2²BIMMU
                Y9                       PERTES & PROFITS NETS                       EU                                     250.00- F   BIMM2BIMMU
CALLS     9/14  E1          17,825.00-H ( 1)                                                                                        F   BIMM2²BIMMU
CALLS     9/14  E1          17,825.00-N ( 1)                                                                                        F   BIMM2²BIMMU
-----------------------------------------------------------------------------------------------------------------------------------                                                                                                                                                                      

Ответы [ 2 ]

5 голосов
/ 20 сентября 2011

Вы можете попробовать использовать фреймворк Fixedformat4j .Он использует аннотации и работает быстро.Я реализовал его частично, чтобы мой проект понял, как он работает.

Вы можете создать класс с аннотациями, подобными этому:

@Record
public class LogRecord {
    private String firm;
    private String user;
    private Date logonDate;
    private String logData;

    public String getFirm() {
        return firm;
    }

    @field(offset=10, length=10)
    public void setFirm(String firm) {
        this.firm = firm;
    }

    public String getUser() {
        return user;
    }

    @field(offset=0, length=10)
    public void setUser(String user) {
        this.user = user;
    }

    public Date getLogonDate() {
        return logonDate;
    }

    @field(offset=nn, length=8)
    @FixedFormatPattern("mm/dd/yy")  
    public void setLogonDate(Date logonDate) {
        this.logonDate = logonDate;
    }

    public String getLogData() {
        return logData;
    }

    @field(offset=mm, length=yy)
    public void setLogData(String logData) {
        this.logData = logData;
    }

}

И затем создать его экземпляр с помощью FixedFormatManager.

1 голос
/ 20 сентября 2011

У меня недавно была похожая проблема, в итоге я использовал Flapjack ( Код Google: Flapjack ) ... Посмотрите примеры кода Google, я думаю, это должно вам помочь.

...