電子書籍の厳選無料作品が豊富!

初めまして。お世話になります。
現在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に含まれている改行コードを削除したいのですが、何か良い案はないでしょうか。
シェルスクリプト内の処理でなんとか解決策を模索しております。

何卒ご教授いただければ幸いです。
誠に申し訳ありませんが宜しくお願い致します。

A 回答 (1件)

while read lineで一行処理→ファイルに>>で追加


ってやるくらいなら、全部まとめてやればいいんです。awkやsed等にはもとから「最初から最後まで1行ずつ読み込んで処理する」機能がついてます。特にawkはプログラミング言語です。PHPほど高機能では無いですが、簡単な処理ならPHPと同等に(処理によってはPHPより簡潔に)使えます。
while read lineなんて方法は、シェルスクリプトでは最後の手段と思っておいた方がいいです。

Excelで出力→Linuxで処理、ということなので、$2に含まれる「改行コード」というのは CR のことかもしれません。

以上をまとめると

・予想するに、もとはこんな感じ
cat 入力.csv | while read line
do
A=`echo $line | awk -F, '{print $1}'`
B=`echo $line | awk -F, '{sub(/\r/,"",$2);print $2}'`
echo INSERT (略) VALUES \(\'$A\',\'$B'\)\; >> $TEMP
done

→これをまとめて1行に
awk -F, '{ sub(/\r/,"",$2) ; printf("INSERT(略) VALUES ('"'%s','%s'"');\n",$1,$2);}' < 入力.csv> $TEMP
# 'の中に'を入れるために、一旦'を閉じて"を使ってます


sedだけでも十分できる
sed 's/\r//g;s/^\([^,]*\),\([^,]*\)/INSERT(略) VALUES ('"'\\1',\\2'"');/' < 入力.csv > $TEMP
#'については同様。後方参照の\1,\2は"の中なので\\1,\\2と表記

内容によっては $TEMP もいらないかも
awk -F, 'BEGIN{print DBへの接続} { sub(/\r/,"",$2) ; printf("INSERT(略) VALUES ('"'%s','%s'"');\n",$1,$2);} END{print DB終了処理}' < 入力.csv | sqlのコマンド



まあ、アップローダのPHPでDBの処理もしてしまうの一番いいのかも
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています