0

私もこれができるかどうかを見つけるのに苦労しています。基本的に、次のようなcsvファイルがあります。

1111,804442232,1
1112,312908721,1
1113,A*2434,1
1114,A*512343128760987,1
1115,3512748,1
1116,1111,1
1117,1234,1

これは、操作のためにメモリ内のsqliteデータベースにインポートされます。いくつかの操作の後、このデータベースに複数のファイルをインポートします。Sqliteを使用すると、Pythonで配列を使用しているときに各制約をチェックするためだけに追加の関数を作成しなくても、テーブルの制約を保持し、必要に応じてエラーを受け取ることができます。field2私はいくつかのことをしたいのですが、最初のことは、すべての文字列がのエントリと一致するfield2を付加することfield1です。

たとえば、上記のエントリ6のデータはエントリ1と一致します。この場合、エントリ6のfield2先頭に次のように追加します。field2'555'

これが不可能な場合は、正規表現を使用してこれを実行でき、4桁のすべての行でこれを実行できると信じていfield2ます...しかし... python/sqliteを使用して正規表現を正常に動作させるにはまだ成功していません。エラー。

私はPython内でSqlite3を使用してsqliteデータベースに接続/操作しています。

編集:csvデータだけを操作するのではなく、sqliteデータベースにある結果のテーブルを操作する方法を探しています。上記のデータは、私が使用しているファイルに含まれているものを単純に表したものです。csvファイルからのデータを含む配列で作業する方が良いでしょうか?これらのファイルには、10,000以上のエントリと約20〜30の列があります。

4

3 に答える 3

2

SQLiteでそれを行う必要がある場合は、これはどうですか?

まず、以下を実行して結果を解析することにより、テーブルの列名を取得します

def get_columns(table_name, cursor):
    cursor.execute('pragma table_info(%s)' % table_name)
    return [row[1] for row in cursor]

conn = sqlite3.connect('test.db')
columns = get_columns('test_table',conn.cursor())

これらの列ごとに、次の更新を実行します。これにより、先頭に追加されます。

def prepend(column, reference, prefix, cursor):
    query = '''
        UPDATE %s
        SET %s = 'prefix' || %s
        WHERE %s IN (SELECT %s FROM %s)
    ''' % (table, column, column, column, reference, table)
    cursor.execute(query)

reference = 'field1'
[prepend('test_table', column, reference, '555', conn.cursor()) 
    for column in columns 
    if column != reference]

これはコストがかかることに注意してください。実行する列ごとにO(n ^ 2)。

あなたの編集とネイサンの答えによると、Pythonの組み込みデータ構造を単純に操作する方が良いかもしれません。後でいつでもSQLiteに挿入できます。

10,000エントリはそれほど多くないので、最終的には問題にならない可能性があります。それはすべて、SQLiteで実行する必要がある理由によって異なります(これについてはあまり詳しくありません)。

于 2012-10-22T00:15:15.707 に答える
1

これを行うために正規表現を使用する必要はありません。最初の列のコンテンツをにスローしてからset、行を反復処理して2番目のフィールドを更新するだけです。

first_col_values = set(row[0] for row in rows)
for row in rows:
    if row[1] in first_col_values:
        row[1] = '555' + row[1] 
于 2012-10-21T21:36:48.853 に答える
1

だから...とんでもない量の自分の検索と試行錯誤の末、自分の質問に対する答えを見つけました。SQLに慣れていないので、あらゆる種類のクレイジーなことを試していたので困惑しました。結局のところ...これは私が探していた単純なタイプのソリューションでした:

prefix="555"
cur.execute("UPDATE table SET field2 = %s || field2 WHERE field2 IN (SELECT field1 FROM table)"% (prefix))

そこに少量のPythonを保持しましたが、探していたのはSQLステートメントでした。なぜ誰もこんなに単純なものを思いついたのかわからない=/。これまでの答えに満足できなかったので、私はこの単純な行をずっと探していました>_<。

于 2012-10-22T03:30:28.233 に答える