• ベストアンサー

csvファイルから、データをシェルで取り込みたい

前の質問 http://oshiete1.goo.ne.jp/kotaeru_vote.php3?q=4899864 他の質問コーナー http://okyuu.com/ja/question/6095 MySQLのデータベースを作成するために、csvファイルをつくって、シェルでテーブルに取り込みたいと思っています。前のスクリプトを書き直したので、新規質問という形で書かせて下さい。 【環境】LINUX Fedora10 MySQL5.0 インターネット接続できず、USBメモリでデータを運んでいる。ここのスクリプトもコピペではなく手書き。 #bash torikomi.sh とうつと torikomi.sh: line 19 : syntax error : unexpected end of file とでてきてしまい、うまく処理できません。 ひとまず、Perlなどは使わず、bashのみにて処理を行いたいと思っています。(Perlは知らない言語なので) スクリプト #!/bin/bash set hensu=`cat /home/******/data1.csv` for i in $hensu do set a=`echo $i | awk -F, '{print $1}'` set b=`echo $i | awk -F, '{print $2}'` set c=`echo $i | awk -F, '{print $3}'` mysql --user=root --password=****** db1<<EOF insert into tbl2(aaa,bbb,ccc) values($a,"$b","$c"); EOF done

  • MySQL
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • saru_
  • ベストアンサー率39% (38/97)
回答No.1

一行づつ処理していると発狂するほど遅いので、普通は下記のようなloadユーティリティーを使うのではないでしょうか? http://yoshimov.com/?page=MySQL%2FCSV%A4%C7%A4%CE%C6%FE%BD%D0%CE%CF bashの練習として、どうしても上記のスクリプトでやりたいということでしたら、bashはあまり詳しくないので、あまりお力になれなさそうです。 ちなみに、私の環境(Cygwin+bash)だと、  set a=`echo $i | awk -F, '{print $1}'` が、きちんと動かず、  a=`echo $i | awk -F, '{print $1}'` というふうに、setを抜かないとダメでした。 a, b, c等の変数に、意図した値が格納されているか確認するとよいかもしれません。 以下は、ご参考です。 #!/bin/bash for i in `cat ./a.csv` do set a=`echo $i | awk -F, '{print $1}'` set b=`echo $i | awk -F, '{print $2}'` set c=`echo $i | awk -F, '{print $3}'` cat <<EOF a is $a b is $b c is $c EOF done

scorpio
質問者

補足

ご回答ありがとうございます。 load というのは知りませんでした。 是非、参考にさせて下さい。 bash は set を使わないみたいですね。 自分はcシェルとごっちゃになっていたようです。 現在 load を使って試していますが、 torikomi.sh line21 ; syntax error :unexpected end of file というエラーに悩んでいます。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

まずは、小さいシェルスクリプトを作って試してみてはどうですか。 それと 「torikomi.sh line21 ; syntax error :unexpected end of file」 とでるならシェルスクリプト全部アップしてみては。

scorpio
質問者

お礼

ご回答ありがとうございます。HERE DOCUMENT については詳しくはないのですが、 どうやら原因はEOFが、改行の関係でエラーになっているようです。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

loadコマンドを使った例 #!/bin/bash mysql -u root -p****** db1<<EOF load data infile '/home/******/data1.csv' into table tbl2 fields terminated by ','; quit EOF

scorpio
質問者

補足

ご回答ありがとうございます。 実例は大変参考になります。 是非、活用させて下さい。 現在 load を使って試していますが、 torikomi.sh line21 ; syntax error :unexpected end of file というエラーに悩んでいます。 端末には、改行を指定するチェックボックスはないようです。 改行エラーでしょうか。

関連するQ&A

  • csvファイルからMySQLにシェルで取り込みをしたい

    【環境】LINUX Ferora10 mysql 5.0 インターネット接続できないPC(データはUSBメモリで導入可能) bash/mysql初心者 教えてgooの参考ページ ​​http://oshiete1.goo.ne.jp/kotaeru.php3?q=2219411​​ mysql で db1 というデータベースに、tbl2というテーブルを作成しました。ここにcsvファイルから、データをインサートしたいのですが、うまくいきません。 これはうってみたコマンド #bash torikomi.sh エラーは syntax error near unexpected token '(' insert ~文 とかがでます。 下記にソースを貼るので間違いがあったら、教えていただけないでしょうか? #!/bin/bash set hensu='cat /home/******/data1'; for i in $hensu do set a='echo $i | awk -F, '{print $1}'' set b='echo $i | awk -F, '{print $2}'' set c='echo $i | awk -F, '{print $3}'' mysql --user=root --password=*******    use db1; insert into tbl2(aaa,bbb,ccc)values(a,"b","c"); exit done できれば、バックグラウンドでMySQLを起動して、いちいちログイン/ログアウトを繰り返さず、 インサート文を打てればいいのですが。

    • ベストアンサー
    • MySQL
  • bashシェルでのmysqlCSVファイルについて

    bashシェルでのmysqlCSVファイルについて教えて下さい。 下記のスクリプト実行するとroot権限者で実施すればうまく動作するのですが、 xxxxユーザで実施した場合は、/tmp/mysql_export_linkdata.csvのファイル所有者がxxxxではなく、mysqlになってしまい ファイル削除(rm)ができません。 何が悪くてどう直せばよいですか? chownで変更したり、chmod 777にしたりやってみたのですが 駄目でした。 #/bin/bash if [ -f /tmp/mysql_export_linkdata.csv ] then rm /tmp/mysql_export_linkdata.csv echo rm /tmp/mysql_export_linkdata.csv fi mysql --user=xxxx --password=xxxx dburl <<eof select * from linkdata into outfile "/tmp/mysql_export_linkdata.csv" fields terminated by ','; eof chown xxxx.xxxx /tmp/mysql_export_linkdata.csv chmod 777 /tmp/mysql_export_linkdata.csv ls -lrt /tmp/mysql_export_linkdata.csv echo ls -lrt /tmp/mysql_export_linkdata.csv

  • シェルスクリプトの1行目に#!を書いてもダメなのはなぜ?

    test.shというシェルスクリプトを #!/bin/bash echo "bash test" のように書き、chmod +x test.shを実行し、 test.shと入力すると、bash testが表示されるはずですが、 エラーbash: test.sh :command not found が出ます。which bashでパスを見ると /bin/bashなので、問題ないはずなんですが。 ちなみに、bash test.shと入力すると、正常に実行されます。 同様のことがperlスクリプト #!/usr/bin/perl print "perl test\n"; についても起こります。 何か設定がまずいのでしょうか? RedHatLinux7.2を使用しています。

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • shellスクリプトに複数の引数を渡したい

    shellスクリプトに複数の引数を渡したいと考えています。 下記のようなperlスクリプトを兼ねる事でやりたいことは達成できました。 これをシェルスクリプトだけでやろうとしていて、ハマってしまい、やり方がわからなかったので、質問しています。 ・echo.shの中身 $ cat echo.sh echo $1 $2 ・imglist.plの中身 $ cat imglist.pl my@imglist= `ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} 2>1&`; foreach(@imglist){ my@name=split /\./,$_; system("bash ./echo.sh $name[0] $name[1]"); } ・実行すると、無事echo.shに引数が2つ渡る。 $ perl imglist.pl abc1 jpg abc10 png abc11 png abc2 jpg abc3 jpg これをシェルのみでやろうとして、はまってしまいました。 以下は、パイプ処理等を使ったりしてやってみたのですが出来ませんでした。 ・awkでファイル名と拡張子に分解し、パイプで渡そうとしても何故か渡らない・・ $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}'| bash ./echo.sh ・ファイルに一旦保存し、catコマンドでパイプで渡しても駄目 $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}' > imglist.txt $ cat imglist.txt | bash ./echo.sh ・echoコマンドを使ってパイプで渡しても駄目 $ echo `cat imglist.txt` |bash ./echo.sh ・for.shというファイルを作成し、for構文でimglist.txtの中身を渡すと引数が一つずつしか渡らない $ cat for.sh for id in $(cat imglist.txt); do echo $id done $ bash for.sh tile1 jpg tile10 jpg どうやれば、コマンドライン上やシェルスクリプトだけで、今回はファイル名と拡張子という形で複数行からなる2つの引数を渡すことができますでしょうか

    • ベストアンサー
    • Perl
  • shのシェルスクリプトの演算方法について・・・

    bashのシェルスクリプトについてもお聞きしたのですが、 その方法では演算ができない!ということになってしまいました・・・ こういうちょこっとしたところが違うのが嫌です・・・↓ bashの場合は ---------- bash$ a=1 bash$ a=$(( $a + 1 )) bash$ echo $a 2 ---------- となったのですが、shではエラーが出てしまいました・・・ また、shのスクリプトもbashのスクリプトもシェルスクリプトと呼ぶのでしょうか?

  • シェルスクリプトの演算について

    下記のような内容で、list変数の値から抽出してtest{i}変数に入れるようにしています。 ※awkコマンドでのprintの値を for の値にしています。 for i in 0 1 2 do test${i}=`echo ${list} | awk '{ print $'${i}' }'` done この例はうまくいくのですが、 print $'${i}'の部分で${i}の値にプラス2したものを利用したく、 test${i}=`echo ${list} | awk '{ print $'${i+2}' }'` や test${i}=`echo ${list} | awk '{ print $i=`expr ${i} + 2` }'` 等を試しましたがうまくいきません。 どのようにすればよいでしょうか。 よろしくお願い致します。

  • CSVファイルの改行コード削除について

    初めまして。お世話になります。 現在Linux環境を使用しており、PHPのアップロードからcsvファイルをアップする機能を設けています。アップロードしたcsvファイルを元にシェルスクリプトでINSERT文を作成している機能になります。 csvファイル自体はローカルのエクセルから作成しています。 例としては、 A1,B1 A2,B2 となっています。 シェルスクリプトでは、アップされたcsvファイルのA1,B1の情報を読み取り変数をセットしていくという単純なものになっています。 具体的にシェルスクリプト内で行っている内容としては、 while read lineを用いて一行ずつ読み、awkを用いてカンマ区切りを指定してprint $1とprint $2で分けたものを変数にセットしています。 具体的には、 echo INSERT (略) VALUES \(\'$変数A(print $1)\',\'$変数B(print $2)'\)\; >> $TEMP という具合に変数をセットしています。 そこで現在問題となっているのが、変数B(print $2)にcsvファイルの改行コードが含まれている為、作成されるINSERT文が途中で改行されて出力されてしまっています。 この変数Bに含まれている改行コードを削除したいのですが、何か良い案はないでしょうか。 シェルスクリプト内の処理でなんとか解決策を模索しております。 何卒ご教授いただければ幸いです。 誠に申し訳ありませんが宜しくお願い致します。

  • telnet 110 のシェルスクリプトについて

    linux初心者です。 telnet localhost 110 の確認スクリプトを作成したいのですが、調べた結果以下のスクリプトを作成しましたがうまく動作してくれません。 お分かりになる方ご教授ください。 test.sh #!/bin/bash sleep 1; echo user $1 sleep 1; echo pass $2 sleep 1; echo stat sleep 1; echo quit test1.sh #!/bin/bash sh ./test.sh | telnet localhost 110 ./test1.sh hogeuser hogepass 同じアカウントの場合$1 $2の部分にuser名 パスワードを記入すればいいのは分かるのですが、毎回アカウント・パスワードが違うため引数に渡したいと思います。 よろしくお願いいたします。