Java中固定宽度文本日志的解析策略
我试图找出如何最好地解析下面的日志文件,将每个由水平线分隔的部分拆分,并提取各种数据,例如“COMPANY123”、“BIMMU”、日期(2/18等),然后创建一个字符串,其中包含由水平线分隔的部分中包含的所有其他数据 也就是说,我想创建一个“语句”对象数组,每个对象都具有以下属性:Java中固定宽度文本日志的解析策略,java,regex,parsing,logging,Java,Regex,Parsing,Logging,我试图找出如何最好地解析下面的日志文件,将每个由水平线分隔的部分拆分,并提取各种数据,例如“COMPANY123”、“BIMMU”、日期(2/18等),然后创建一个字符串,其中包含由水平线分隔的部分中包含的所有其他数据 也就是说,我想创建一个“语句”对象数组,每个对象都具有以下属性: Company name, Account, Date, Data. 例如,对于下面的第二条记录 Account = 'BIMMU' Firm = 'Super Corporation' Date= 9/14/1
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(142147)代码>
我是否应该分两次执行此操作,例如,将代码拆分为由水平线分隔的部分,然后分别解析这些部分
在这里写下这篇文章有助于我了解自己的思路,但如果其他人有任何聪明的想法,那么听到这些想法就太好了
最近我遇到了类似的问题,我最终使用了Flapjack()。。。看看谷歌代码上的例子,我想它应该会对你有所帮助。你可以尝试使用框架。它使用注释,工作速度很快。我已经部分地实现了它,以便我的项目能够理解它是如何工作的
您可以创建具有如下注释的类:
@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实例化它
@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;
}
}