2016-12-02 6 views
-1

bashの配列からテーブルを作成しようとしています。私はそれをテキストファイルから配列を作成する方法を考え出したが、テーブルを作成することは機能しないか、配列の最後の値しか使用しない。私はできないことをしようとしていますか?BASHアレイからSQLite3テーブルを作成

マイスクリプト:

readarray -t array < file.txt 
for e in "${array[@]}" 
do 
DB_PATH="" 
DB_NAME=$DB_PATH"Test.db" 
sqlite3 $DB_NAME << EOF 
DROP TABLE IF EXISTS tblA; 
CREATE TABLE tblA(A,B,C); 
INSERT INTO tblA (A,B) SELECT tblB.A,tblB.B,1 FROM tblB WHERE tblB.D="$e"; 
EOF 
done 

私はまた、全体のSQLコードを含めるように編集WHERE tblB.D="${array[@]}";

を試してみました。

+0

を私はSQLには専門家でないが、あなたは、テーブルをドロップした場合、私はドン」あなたがテーブルを落としたなら、何もどこにもないので、あなたは 'INSERT ... WHERE'を実行できると信じています。 WHEREとINSERTを一緒に使用することはできません。 –

+0

@ MarkSetchell古いテーブルは削除され、新しい配列値で再作成されます。 WHEREステートメントはINSERTで動作しますが、この場合は動作しません。配列の各値を特にtblB.D = "$ {array [0]}"または "tblB.D =" $ {array [1]} "などのように呼び出すと動作します。しかし、配列に100以上の値がある場合には特に呼び出す必要はありません。 – taylorbuckeye

+0

あなたの完全なコードを表示するかもしれないので、私は理解することができます... –

答えて

1

問題は、ループが繰り返されるたびにテーブルが再作成(つまり空になります)することです。

テーブルを1回だけ作成します。ループ内では、INSERTだけを実行します。

+0

ああ!修正/追加する必要がある単純なものだとわかっていましたが、SQLiteスクリプトにあるとは思いませんでした!ありがとうございました!私はまだこのスクリプトに問題がありましたが、これは間違いなく助けになりました。 – taylorbuckeye

1

主キーはインクリメントではなく、最初からやり直すために続けているが(小さな問題)、このスクリプトは動作しています:

sqlite3 Test.db "DELETE FROM tblA;" 

getArray() { 
    array=() 
    while IFS= read -r line 
    do 
     array+=("$line") 
    done < "$1" 
    } 

getArray "file.txt" 

for e in "${array[@]}" 
do 
    DB_PATH="" 
    DB_NAME=$DB_PATH"Test.db" 
    sqlite3 $DB_NAME << EOF 
    INSERT INTO tblA (A,B) SELECT tblB.A,tblB.B,1 FROM tblB WHERE tblB.D="$e"; 

EOF 

done 
+0

今すぐカウンタを追加する方法を理解する必要があります。 – taylorbuckeye

+0

"getArray"の上にsqlite3 Test.db "DROP TABLE ...."とsqlite3 Test.db "CREATE TABLE ...."プライマリキーのインクリメント "issue"を修正し、インサートは正しく動作します。 – taylorbuckeye

関連する問題