質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Q&A

1回答

691閲覧

シェルスクリプトでmysql操作とデータの入れ替え

shibatifay

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

0グッド

0クリップ

投稿2023/03/22 13:39

編集2023/03/23 13:26

実現したいこと

・シェルスクリプトで二つのデータを結合後、そのデータをmysqlにインポートしたい。

前提

現在シェルスクリプトにて、DB上のデータを丸ごと入れ替えるスクリプトを作成しています。
主な処理の流れとしては、以下の通りです。
1.mysqlに接続(ユーザー情報などは外出し)
2.DB上に既に存在しているデータをトランケート
3.同一テーブルから更新区分と追加区分に分けたデータを結合(キーは同じだけど値はマッチしない)
4.mysqlコマンドを実行して任意のテーブルにインポート

該当のソースコード

#!/bin/bash # 定数の定義 readonly MYSQL_SCHEMA="test" readonly ROOT_DIRECTORY="〇〇〇/info.conf" readonly CMD_MYSQL="mysql --defaults-file=$ROOT_DIRECTORY/info.conf -t $MYSQL_SCHEMA" readonly INSERT=加工されたデータのファイルパス readonly INSERT_1=加工されたデータのファイルパス readonly REPLACE=加工されたデータのファイルパス readonly REPLACE_1=加工されたデータのファイルパス #テーブル削除 truncateSqlTable="TRUNCATE TABLE table_name;" truncateSqlTable_1="TRUNCATE TABLE table_name;" #テストデータ統合処理 ImportFile=`cat {$INSERT}{$REPLACE} > import.csv` ImportFile_1=`cat {$INSERT_1}{$REPLACE_1} > import_1.csv` #データベースインポート処理 loadSql="LOAD DATA LOCAL INFILE \"${ImportFile}\" INTO TABLE "table_name" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';" loadSql_1="LOAD DATA LOCAL INFILE \"${ImportFile_1}\" INTO TABLE "table_name" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';" #sql実行 mysql -e "{$CMD_MYSQL}${truncatesqlTable}${truncatesqlTable_1}${loadsql}${loadsql_1}"

試したこと

結合する部分にて、物理名は同じだが値が異なるのでcatコマンド以外に思いつきませんでした。
ソース自体へのアドバイスや良い結合の仕方などをご教示頂きたいです。

補足情報

テーブル名や変数名などは適当に伏せるためにつけました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

具体的なデータが書いてないので、なんとも言えないところですが、少なくとも、

sh

1ImportFile=`cat {$INSERT}{$REPLACE} > import.csv` 2ImportFile_1=`cat {$INSERT_1}{$REPLACE_1} > import_1.csv`

は変です。INSERTREPLACEはファイルのパスが入っているようですが、例えば、

sh

1INSERT=foo.csv 2REPLACE=bar.csv 3ImportFile=`cat {$INSERT}{$REPLACE} > import.csv`

だったとすると、catの部分はcat {foo.csv}{bar.csv} > import.csvですね。
ファイル名が{foo.csv}{bar.csv}であるようなファイルは存在しないでしょうね。
{$INSERT}{$REPLACE}は、おそらく${INSERT}${REPLACE}の勘違い。
そして、2つの文字列が繋がった1つのファイル名じゃなくて2つの別々のファイル名とするためには間に空白が必要です。
つまり、

sh

1cat {$INSERT}{$REPLACE} > import.csv 2↓↓↓ 3cat ${INSERT} ${REPLACE} > import.csv

です。これで2つのファイルが連結されます。

また、

sh

1ImportFile=`cat ${INSERT} ${REPLACE} > import.csv`

は、catコマンドの標準出力結果を変数ImportFileに代入するという意味ですが、catコマンドの標準出力(ファイルの結合結果)はファイルにリダイレクトされているので何もありません。つまり、変数ImportFileの中身は空文字列になります。ファイル名を入れたいなら、

sh

1ImportFile=import.csv 2cat ${INSERT} ${REPLACE} > $ImportFile

でしょうか。
全体的に「雰囲気」で書いているように見えますが、厳密に考えて書かないと期待通りには動きません。

投稿2023/03/22 14:30

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibatifay

2023/03/22 15:03

otnさん ご丁寧にご回答ありがとうございます。 >>全体的に「雰囲気」で書いているように見えますが、厳密に考えて書かないと期待通りには動きません。 おっしゃる通りで少し甘いと感じています。 otnさんから見て頂いた際にDBへの接続やSQLの実行は問題なさそうでしょうか。 お手隙でご回答いただけたら嬉しいです。
otn

2023/03/22 16:12

> otnさんから見て頂いた際にDBへの接続やSQLの実行は問題なさそうでしょうか。 眺めただけですが、いろいろおかしそうです。 変数の扱いがよくわかってなさそうなので、とりあえず変数を使うのを一切止めて、 cat ~~~ ~~~ > ~~~ cat ~~~ ~~~ > ~~~ mysql -e "~~~ ~~~" の3行だけにしてはどうでしょうか。 変数の扱い方の学習はもっとシンプルな例題で。
shibatifay

2023/03/23 13:27

otnさん 実際に接続を試したところうまく実行できませんでした。 変数の扱い方についてはもう少し学習してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問