4

バックグラウンド:

sqlite は、データベースにロードされたデータに対して SQL 操作を実行するのに最適ですが、私の仕事では、データベースにロードされず、必ずしも時間をかける価値のないファイルに対して select、join、および where ステートメントを実行する必要があることがよくあります。データベースへのロード/初期化。また、sqlite のランダム アクセス特性により、データベース内のすべての行に対して実行される操作が遅くなることがよくあります。

質問:

sqlite を必要とせず、生のタブ間隔ファイルだけで動作する一連の SQL タイプのコマンド/fxns (できれば python/bash) はありますか? たとえば、テーブルを使用して行を選択する代わりに、列番号のみを使用します。

select col1,col2,col3 from fileName.tsv where col1[int] < 3

注: これの多くは awk、cut、bash-join などで実現できることを認識しています。もっとSQLらしいものがあるかどうか疑問に思っていましたか?

4

3 に答える 3

2

csvモジュールとリストの内包表記を使用して、何かを一緒にハックできます。

import csv

reader = csv.reader(open('data.csv', 'r'))
rows = [row for row in reader]

# select * from data where first column < 4
# this won't actually work as-is! see the edit below
[row for row in rows if row[0] < 4]

# select * from data where second column >= third column
[row for row in rows if row[1] >= row[2]]

# select columns 1 and 3 from data where first column is "mykey"
[[row[0], row[2]] for row in rows if row[0] == "mykey"]

おそらく、Python の関数型プログラミング ツールを使用すると、さらに印象的なことをいくつか行うことができますが、FP にまだ慣れていない場合は、これだけで学ぶにはトピックが大きすぎるでしょう ;-)


編集:さらにいくつかのヒント:

  • スクリプトごとに 1 つの「クエリ」のみを実行する場合は、データの中間ストレージを切り取ることができます (rows私の例では)。

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    result = [row for row in reader if row[0] == "banana"]
    
  • csv リーダーはすべての出力をテキストとして生成するため、1 つの列を整数などとして扱いたい場合は、自分で行う必要があります。たとえば、2 番目と 3 番目の列が整数の場合、

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    rows = [[row[0], int(row[1]), int(row[2])] for row in reader]
    # perform a "select" on rows now
    

    (これは、上記の最初の例が実際にはそのままでは機能しないことを意味します。)すべての列が整数の場合、関数map関数を呼び出すことができます。

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    rows = [map(int, row) for row in reader]
    
于 2011-09-21T00:00:04.543 に答える
1

グーグルした後、 KirbyBasepython equivalent of DBD::CSVを見つけました。それは法案に合うように見えます。

しかし、私は通常Pythonを使用しないので、試したことはありません。

追加のために編集: わかりました。ドキュメントを一瞥した後、クエリコマンドは正確にはSQLではありませんが、awkを使用するよりもはるかにSQL風です。

于 2011-09-20T23:45:30.157 に答える
0

Microsoft のログ パーサー 2.2 を強くお勧めします。ただし、Linux を使用しているとは限りません。うまくいかないことは確かです。ただし、Linux を使用していない人がいる場合に備えて、ここにリンクを貼っておきます。

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659 http://www.codinghorror.com/blog/2005/08/microsoft-logparser.html

于 2011-09-21T00:06:53.850 に答える