• 締切済み

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に含まれている改行コードを削除したいのですが、何か良い案はないでしょうか。 シェルスクリプト内の処理でなんとか解決策を模索しております。 何卒ご教授いただければ幸いです。 誠に申し訳ありませんが宜しくお願い致します。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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の処理もしてしまうの一番いいのかも