2

更新:データの形式を明確にするための例を追加しました。

各行が次のようにフォーマットされたCSVを検討します。

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+

ここで、[tbl2.col1:tbl2.col2] +は、これらのペアがいくつでも繰り返される可能性があることを意味します

元:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2

テーブルは、上記の列に加えて作成する必要があるキーとして行番号を使用して相互に関連付けられます。

  1. mysql load data infileデータを2つの別々のテーブルにロードするために使用する方法はありますか?
  2. そうでない場合、これに最適なUnixコマンドラインツールはどれですか。
4

2 に答える 2

1

いいえ、直接ではありません。ロードデータは、1つのテーブルまたはパーティションテーブルにのみ挿入できます。

実行できるのは、データをステージングテーブルにロードしてから、を使用insert intoして2つの最終テーブルの個々の列を選択することです。substring_indextbl2の値に異なる区切り文字を使用している場合にも必要になることがあります。行番号は、ステージングテーブルの自動インクリメント列によって処理されます(最も簡単な方法は、自動列をステージングテーブル定義の最後にすることです)。

形式は正確には明確ではなく、perl / php / pythonを使用して行うのが最適ですが、本当にシェルツールを使用したい場合は次のようにします。

cut -d , -f 1-5 file | awk -F, '{print NR "," $0}' > table1

cut -d , -f 6- file | sed 's,\:,\,,g' | \
  awk -F, '{i=1; while (i<=NF) {print NR "," $(i) "," $(i+1); i+=2;}}' > table2

これにより、次の内容のtable1ファイルとtable2ファイルが作成されます。

1,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
2,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
3,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5

1,tbl2.col1,tbl2.col2
1,tbl2.col1,tbl2.col2
2,tbl2.col1,tbl2.col2
2,tbl2.col1,tbl2.col2
3,tbl2.col1,tbl2.col2
3,tbl2.col1,tbl2.col2
于 2010-01-24T22:07:14.600 に答える
1

あなたが言うように、問題のある部分は、各行で宣言された[tbl2.col1:tbl2.col2]ペアの数が不明であるということです。私はこれを解決したいと思いsedます:1つのファイルを2つのファイルに分割します(テーブルごとに1つ)。次に、を使用load data infileして各ファイルを対応するテーブルにロードできます。

于 2010-01-24T22:35:48.167 に答える