2013-01-08 37 views
1

我有一个具有以下格式的巨大文本文件(作为ASCII文件)。我正在使用python进行处理。对于这种文件,我有几个问题(以更通用的方式)。按特定顺序搜索文本文件数据的特定格式

  1. 如何检查数据格式的正确性?有没有办法指定一个模板,然后验证这些文本文件的正确性? (类似于xml的dtd文件)。
  2. 第二个问题是解析这些文件并从文件中读取数据。就像我期待的XYZ数据出现在time行之后,需要解析它们。这种情况下的任何简单机制?再次像模板和分析机制。
===========================BEGIN========================================= 
2012-12-05 12:03 
XYZ 123(0) 654(2) 232(4) 
MON 23(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
===========================BEGIN========================================= 
2012-12-05 12:04 
XYZ 123(0) 654(2) 232(4) 
MON 23(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
===========================BEGIN========================================= 
2012-12-05 12:05 
XYZ 523(0) 654(2) 235(4) 
MON 83(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
===========================BEGIN========================================= 
2012-12-05 12:03 
XYZ 193(0) 644(2) 232(4) 
MON 23(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 

回答

1

你可以尝试以下的变化: -

import re 
s = '''===========================BEGIN========================================= 
2012-12-05 12:03 
XYZ 123(0) 654(2) 232(4) 
MON 23(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
===========================BEGIN========================================= 
2012-12-05 12:04 
XYZ 123(0) 654(2) 232(4) 
MON 23(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
===========================BEGIN========================================= 
2012-12-05 12:05 
XYZ 523(0) 654(2) 235(4) 
MON 83(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
===========================BEGIN========================================= 
2012-12-05 12:03 
XYZ 193(0) 644(2) 232(4) 
MON 23(0) 54(2) 32(4) 
POR 13(0) 64(1) 92(2) 
=========================== END ========================================= 
''' 
print re.findall(r'=+BEGIN=+\s+(\d+-\d+-\d+\s+\d+:\d+)\s+(((XYZ|MON|POR).*\s+){3})', s) 

此打印: -

[('2012-12-05 12:03', 'XYZ 123(0) 654(2) 232(4) \nMON 23(0) 54(2) 32(4) \nPOR 13(0) 64(1) 92(2) \n'), 
('2012-12-05 12:04', 'XYZ 123(0) 654(2) 232(4) \nMON 23(0) 54(2) 32(4) \nPOR 13(0) 64(1) 92(2) \n'), 
('2012-12-05 12:05', 'XYZ 523(0) 654(2) 235(4) \nMON 83(0) 54(2) 32(4) \nPOR 13(0) 64(1) 92(2) \n'), 
('2012-12-05 12:03', 'XYZ 193(0) 644(2) 232(4) \nMON 23(0) 54(2) 32(4) \nPOR 13(0) 64(1) 92(2) \n')] 
0

为了解决第一个问题 - 你可以通过拆分选项卡中的文件的每一行(如果是当然的分离选项卡)。然后您知道哪些元素位于列表的哪个位置。 所以你可以使用,例如dateutil.parser来检测日期是否是适当的日期字符串。

至于你的第二个问题 - 如果可能,我会用字典。因此,如果XYZ始终是一行中的第一个条目,那么我会将该值用作关键字。其余的XYZ线可以成为数据。 使用这种方法,你不会期望文件的行按任何特定的顺序。