按特定顺序搜索文本文件数据的特定格式

时间:2013-01-08 07:03:22

标签: python parsing

我有一个包含以下格式的大文本文件(作为ASCII文件)。我正在使用python进行相同的处理。对于这种文件,我几乎没有问题(以更通用的方式)。

  1. 如何检查数据格式的正确性?有没有办法指定模板,然后验证这些文本文件的正确性? (类似于xml的dtd文件)。
  2. 第二个问题是解析此类文件并从文件中读取数据。就像我期望XYZ行之后的time数据一样,需要解析它们。这种情况的任何简单机制?再次像模板和解析机制。
  3. ===========================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 =========================================  
    

2 个答案:

答案 0 :(得分: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')]

答案 1 :(得分:0)

要解决您的第一个问题 - 您可以通过制表符分割文件的每一行(如果它当然是制表符分隔)。然后,您可以知道哪些元素位于列表的哪个位置。 因此,您可以使用例如dateutil.parser来检测日期是否是正确的日期字符串。

至于你的第二个问题 - 我会尽可能使用字典。因此,如果XYZ始终是一行的第一个条目,我会使用该值作为键。然后,XYZ线的其余部分可以是数据。   使用此方法,您不必期望文件的行以任何特定顺序。