@ jan-steinmanには、この種のタスクにはデータベースを使用する必要があることに同意します。他の回答が示すように、シェルスクリプトを使用してソリューションをハックする方法はたくさんありますが、その方法を使用すると、コードを使用して、たった1日の使い捨てプロジェクトです。
Linuxボックスを使用していると仮定すると、Python v2.5の時点でsqlite3ライブラリを含むPythonがデフォルトでインストールされている可能性があります。Pythonのバージョンは次の方法で確認できます。
% python -V
Python 2.7.2+
sqlite3ライブラリの使用をお勧めします。これは、すべてのプラットフォーム(Webブラウザー内を含む)に存在するシンプルなファイルベースのソリューションであり、サーバーをインストールする必要がないためです。本質的にゼロ構成とゼロ保守。
以下は、例として指定したファイル形式を解析し、単純な「すべて選択」クエリを実行して、dbに保存されているすべてを出力する単純なpythonスクリプトです。
#!/usr/bin/env python
import sqlite3
import sys
dbname = '/tmp/simple.db'
filename = '/tmp/input.txt'
with sqlite3.connect(dbname) as conn:
conn.execute('''create table if not exists people (key integer primary key, name text, job text)''')
with open(filename) as f:
for key in f:
key = key.strip()
name = f.next().strip()
job = f.next().strip()
try:
conn.execute('''insert into people values (?,?,?)''', (key, name, job))
except sqlite3.IntegrityError:
sys.stderr.write('record already exists: %s, %s, %s\n' % (key, name, job))
cur = conn.cursor()
# get all people
cur.execute('''select * from people''')
for row in cur:
print row
# get just two specific people
person_list = [1358726575123, 9973834728345]
cur.execute('''select * from people where key in (?,?)''', person_list)
for row in cur:
print row
# a more general way to get however many people are in the list
person_list = [1358726575123, 9973834728345]
template = ','.join(['?'] * len(person_list))
cur.execute('''select * from people where key in (%s)''' % (template), person_list)
for row in cur:
print row
はい、これはSQLを学ぶ必要があることを意味しますが、長期的にはそれだけの価値があるでしょう。また、ログファイルを解析する代わりに、sqliteデータベースに直接データを書き込むこともできます。