1

mysqlimportbash スクリプトを使用して、 5 つの異なるcsvファイルを共通のデータベース テーブルにインポートするために使用しています。

File[0]=one
File[1]=two
File[2]=three
File[3]=four
File[4]=five

for i in 0 1 2 3 4 5 6 7 8 9 10  
do 
   mysqlimport --fields-optionally-enclosed-by=\" --fields-terminated-by=, --lines-terminated-by="<br />\n" -uusername -ppassword --local tablename /path/${File[i]}.txt
done

ここで、各ファイルに一意の ID を持つ共通テーブルに追加の列を追加したいと考えました。例えば。one.csv のすべてのエントリについて、id の値は 1 になります。bash

スクリプトを使用してインポートすると同時にこれを行う方法はありますか? 毎回 mysql コンソールにアクセスして、そこから実行したくありません。

任意の提案をいただければ幸いです。

4

2 に答える 2

2

まず第一に、mysqlimportはLOAD DATA INFILESQLステートメントの単なるラッパーであり、mysqlimportは便利ですが、実行しようとしていることを困難にするいくつかの制限があります。

  1. テーブル名を指定することはできません。ファイル名からテーブル名を推測します
  2. インポート時に特定の値にフィールドを設定できる、使用したいsetオプションは、mysqlimportのオプションとしては存在しません(ただし、ベアSQLには存在します)。

このため、mysqlimportをスキップして、sqlステートメントを直接実行することをお勧めします。

このようなことをする必要があります:

File[0]=one
File[1]=two
File[2]=three
File[3]=four
File[4]=five

for i in 0 1 2 3 4 5 6 7 8 9 10  
do
  qry="LOAD DATA LOCAL INFILE '/path/${File[i]}.txt' INTO TABLE tablename FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\"' LINES TERMINATED BY \"<br />\n\"  (list,comma,separated,column,names,here) SET source_id='$i'"

  mysql -uusername -ppassword << eof
  $qry
  eof
done

このSET source_id='$i'フィールドは、インポート時にそのフィールドを設定するための鍵です。

注:このコードはテストされていませんが、正しい方向に進むはずです。のmysqlマニュアルを読んで、LOAD DATA INFILE「mysqlbash」をグーグルで検索してください。

于 2012-11-30T20:33:49.037 に答える
0

次のようなアプローチはどうでしょうか。

#!/bin/bash

echo>/tmp/tmpfile.csv

for i in 0 1 2 3 4 5 6 7 8 9 10
do
  for j in `cat ${FILE[i]}.TXT`; do echo $i,$j>>/tmp/tmpfile.csv; done
done

mysqlimport ..... --table localfile /tmp/tmpfile.csv
rm -f /tmp/tmpfile.csv

もちろん、これは不完全/テストされていないコードですが、最初に列を追加した完全なファイルを作成してから、そのファイルをインポートするというアイデアが得られます。

mysqlimport をバイパスして、同様に SQL を構築することもできます。

#!/bin/bash

echo>/tmp/tmpfile.csv

for i in 0 1 2 3 4 5 6 7 8 9 10
do
  for j in `cat ${FILE[i]}.TXT`; do echo "insert into tablename (a,b,c,d,e) values ($i,$j);">>/tmp/tmpfile.csv; done
done

mysql -D dbname -u user --password=pass < /tmp/tmpfile.csv
rm -f /tmp/tmpfile.csv
于 2012-11-30T20:46:55.240 に答える