0

ここでは極端な python/sql 初心者です。私はこれについていくつかの助けを探しましたが、必要なものを正確に見つけることができませんでした.

タイトルが示すように、できればPythonを使用してSQLデータベースに解析したい非常に大きなテキストファイルがあります。テキストファイルは次のように設定されています。

#Parent field 1.1
child 1.1
child 1.1 continued

# Parent field 1.2
child 1.2

# Parent field 1.3
child 1.3 text
child 1.3 text
more child 1.3 text

...

# Parent field 1.88
child 1.88

#Parent field 2.1
child 2.1

etc...

リストに関するいくつかの重要なポイント:

  • 最初のフィールド (つまり、1.1、2.1) には # の後にスペースがありません
  • 各子行の長さは可変の文字長と改行ですが、次の親の前には常に空の行があります
  • 親ごとに 88 個のフィールドがあります
  • 何百もの親フィールドがあります

ここで、各親フィールド (1.1、1.2、1.3 --> .88) を列にし、行に後続の数値 (2.1、3.1 --> 100s) を入力したいと思います。

誰かがPythonスクリプトのセットアップを手伝ってくれて、解析を開始する方法を教えてくれませんか? タスクを適切に説明していない場合はお知らせください。すぐに詳細をお知らせします。

本当にありがとう!

ベン

編集: 列の数が一定の 88 ではなく、可変であることに気付きました

4

2 に答える 2

2

いくつかのポイント:

  1. 説明から、データを 1 つのテーブルで非正規化することを目指しているようです。これは一般的に良い考えではありません。データを PARENT と CHILDREN の 2 つのテーブルに分割します。PARENT には ID が含まれている必要があり、CHILDREN には少なくとも 2 つの列が必要です。次に、解析中に、VALUES("1.1", "1.1childA")、VALUES("1.1", "1.1childB") などを使用してテーブル CHILDREN 関連レコードに INSERT します。

  2. 行ごとに繰り返し、「親」行でparent_idとINSERTをPARENTに変更し、子行を読み取り、それらをCHILDRENテーブルにINSERTします。2 つのパスで行うこともできます。

次のようにします。

#!/usr/bin/python

parent=''
child=''

for line in open('input.txt'):
        if line.find('#Parent') > -1 or line.find('# Parent') > -1:
                parent = field_extract(line) # fun where you extract parent value
                parent_id = ... # write it down or generate
                # INSERT into PARENT
        elif line:
                child = field_extract(line)
                # INSERT into CHILDREN with parent_id and child values

とはいえ...とても原始的なものを見ると身震いします。この種の作業には絶対に最適な Pyparsing モジュールを学ぶことをお勧めします。

于 2013-01-18T16:46:43.537 に答える
1

Pythonでのファイル処理を調べる必要があります。

open() , .readlines()メソッドとリストは大いに役立ちます。

例えば:

f = open("NAMEOFTXTFILE.TXT","r") #r for read, w for write, a for append.
cell = f.readlines() # Displays the content in a list
f.seek(0) # Just takes the cursor to the first cell (start of document)
print cell[2] # Prints the word or letter in the second cell.

そこから、cell[2]SQL ステートメントで送信できます。

于 2013-01-18T16:43:02.450 に答える