0

mysqlデータベースにロードしたい均一な行がたくさんあるテキストファイルがありますが、ファイルは完全に均一ではありません。いくつかの雑多な情報のために最初にいくつかの行があり、6行ごとにタイムスタンプがあります。

私のファイル形式のため、「LOADDATAINFILE」はここでは答えのようには見えません。十分な柔軟性がないようです。

注:ファイルのヘッダーは、事前に決定された行数を占めます。タイムスタンプは予測可能ですが、無視する必要のあるポップアップする可能性のある他のランダムなメモがいくつかあります。それらは常に私がチェックできるいくつかのキーワードで始まります。

真ん中の私のファイルのサンプル:

  103.3     .00035
  103.4     .00035
  103.5     .00035
  103.6     .00035
  103.7     .00035
  103.8     .00035
  103.9     .00035
Time: 07-15-2009 13:37
  104.0     .00035
  104.1     .00035
  104.2     .00035
  104.3     .00035
  104.4     .00035
  104.5     .00035
  104.6     .00035
  104.7     .00035
  104.8     .00035
  104.9     .00035
Time: 07-15-2009 13:38
  105.0     .00035
  105.1     .00035
  105.2     .00035

これから、3つのフィールドに情報をロードする必要があります。最初のフィールドはファイル名である必要があり、他のフィールドは例に含まれています。各データ行の前にファイル名を追加することもできますが、スクリプトを使用してデータをロードする場合は、これは必要ない場合があります。

必要に応じてファイル形式を変更できますが、タイムスタンプとヘッダー情報を失いたくありません。

SQLAlchemyは、私がよく知っているpythonに適した選択肢のようです。

私は数千行のデータを持っているので、すでに持っているすべてのファイルのロードは最初は遅いかもしれませんが、その後、ファイルの新しい行をロードしたいだけです。したがって、重複する情報は必要ないため、ロードする内容を選択する必要があります。

テキストファイルからmysqlデータベースへの選択的なデータロード方法に関する提案はありますか?そしてそれを超えて、まだデータベースにないファイルの行にのみロードするために何を提案しますか?

皆さんありがとう。その間、SQLAlchemyをもう少し調べて、それでどこかに到達するかどうかを確認します。

4

2 に答える 2

2

これを行う別の方法は、Pythonにファイルを変換させることです。非常に簡単に指定した基準に基づいて、入力ファイルを出力ファイルにフィルター処理することができます。このコードは、指定した基準についてlineをチェックし、データの場合はtrueを返す関数is_data(line)があることを前提としています。

with file("output", "w") as out:
  for line in file("input"):
    if is_data(line):
      out.write(line)

さらに、ファイルを連結し続ける場合は、最後に記録されたオフセットを保存して読み取ることができます(このコードは、100%正しくない可能性があります。テストしていません。しかし、アイデアは得られます)。

if os.path.exists("filter_settings.txt"):
   start=long(file("filter_settings.txt").read())
else:
   start=0

with file("output", "w") as out:
  input = file("input")
  input.seek(start)
  for line in input:
    if is_data(line):
      out.write(line)
  file("filter_settings.txt", "w").write(input.tell())
于 2009-07-28T18:42:22.703 に答える
2

LOAD DATA INFILEには、ヘッダーをスキップするために使用できるIGNORELINESオプションがあります。ドキュメントによると、「LINES STARTING BY'prefix_string'」オプションもあります。これは、すべてのデータ行が2つの空白で始まるように見え、タイムスタンプは行の先頭から始まるためです。

于 2009-07-28T18:15:11.760 に答える