1

以下の形式の巨大なテキスト ファイルがあります (ASCII ファイルとして)。同じ処理にpythonを使用しています。この種のファイルについて、(より一般的な方法で) いくつか質問があります。

  1. データ形式が正しいことを確認するにはどうすればよいですか? テンプレートを指定して、そのようなテキスト ファイルの正確性を検証する方法はありますか? (xml の dtd ファイルに似ています)。
  2. 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 =========================================  
4

2 に答える 2

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')]
于 2013-01-08T08:21:27.460 に答える
0

最初の質問に対処するには、ファイルの各行をタブで分割できます (もちろんタブで区切られている場合)。これにより、どの要素がリストのどの位置にあるかがわかります。したがって、たとえば dateutil.parser を使用して、日付が適切な日付文字列であるかどうかを検出できます。

2 番目の質問については、可能であれば辞書を使用します。したがって、XYZ が常に行の最初のエントリである場合、その値をキーとして使用します。XYZ 行の残りの部分がデータになる可能性があります。この方法を使用すると、ファイルの行が特定の順序になっているとは限りません。

于 2013-01-08T07:17:29.197 に答える