java - Java解析定宽文本日志的技巧

标签 java regex parsing logging

我正在尝试弄清楚如何最好地解析以下日志文​​件,拆分由水平线分隔的每个部分并提取各种数据,例如'COMPANY123'、'BIMMU'、日期(2/18 等),然后创建一个字符串,其中包含由水平线分隔的部分中包含的所有其他数据。

即,我想创建一个“声明”对象数组,每个对象都具有以下属性:

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

最佳答案

你可以尝试使用框架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 实例化它。

关于java - Java解析定宽文本日志的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7482021/

相关文章:

java - 在运行时观察 application.properties 的变化 Spring boot

java - 如何使用 apache.commons.configuration 更改 .properties 文件

Perl网络爬虫,从只有 "style"标签的DIV中提取内容?

python - 如果我使用 lxml 而不是 BeautifulSoup,我会更好地控制我的蜘蛛吗?

python - 在scrapy中解析href的链接项

java - 如何在 JTree 中将 HTML 显示为纯文本?

java - 在 Java 中形成正则表达式来提取 wiki 链接

Java String.replaceAll 不替换并发重复序列

c# - 执行 Regex.Replace() 时如何使用命名组

ruby - 使用 RegExp 的 Sinatra 路由参数