• 締切済み

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の処理もしてしまうの一番いいのかも

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • csvファイル改行コードの置換について

    お世話になります。 csvファイルで作成したデータを出力表示させるスクリプトで csvファイル内の改行コード(セル内)以後のデータが出力できません。 下記の置換で改行コード以後のデータが表示されません。 $abc =~ s/\r\n//g; $abc =~ s/\n//g; $abc =~ s/\r//g; csvファイル内の改行の数が多く、1行のデータが改行の為に、2行になったりしているので出力前に置換し表示させる方法です。 csvファイル作成時につく""は正常に置換しています。 似たような質問もあったのですが、少し違うようですので質問いたしました。 何卒、ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • CSVファイルの改行コードについて。

    http://ja.wikipedia.org/wiki/Comma-Separated_Values http://www110.kir.jp/study/jissen/script3075.html http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89 上記のウェブページ群を拝見しましても、 「CSVファイルの改行コード」の読み方が分かりませんでしたので、 業務で困っておりますから、改行コードの値の具体例を教えて頂けませんでしょうか?

  • テキストファイルの最終行の改行コード削除

    お世話になります。 SQLコマンドを発行し、csvファイルを自動生成させるシェルスクリプトを作ったのですが、最終行にある改行コードを削除して欲しいとの指示を受けて、その方法を調査。試行錯誤しているのですがよい方法が見つかりません。 最終行にある改行コードのみを削除するにはどうしたら宜しいでしょうか。 ご教示頂ければ幸いです。 宜しくお願い致します。                                以上

  • CSV出力で改行がうまくできない。

    VBAでテキストファイルにCSV出力をおこなっています。 方法は、 Print #FreeFile, FreeFileOutput; でおこなっています。FreeFileOutputは変数でカンマで区切られた複数の値が はいっています。最後はカンマはありません。つまり、 "a,b,c,d" といった値がFreeFileOutputにはいっています。 これをループでまわして、複数行を出力したいとおもっています。 無事に出力はできるのですが、テキストファイルを見ると各行の終わりで改行 されていません。print関数を使い";"をつけると自動で改行が入力される みたいですがされません。どうしてでしょうか?

  • javaにおけるCSV出力時の文字コード改行コード

    JavaでCSVを出力する処理を作りました。 下記コードだとUnix環境で文字コードSJISで改行コードLFで出力されますが、 Windows環境でもUnix環境でも一律、文字コードSJISで改行コードCRLFで出力されるようにしたいです。 何かいい方法はありませんでしょうか。 なお、printlnで出力している行が多い為、 bw,Print("日付" + 変数A + \r\n); というふうに一行づつ変更するのは避けたいと思っております。 try{ PrintWriter bw = new PrintWriter(new BufferdWriter(new OutputStreamWriter(new FileOutputStream(/tmp/test.csv),"SJIS"))); bw.println("日付" + 変数A); bw.println("氏名" + 変数B); ・ ・ ・ }catch(Exception e){ // ログに出力 }

    • ベストアンサー
    • Java
  • 改行コードがあるか判別する方法

    テキストファイルの内容に改行コードが入っていた場合、ビープ音を鳴らすようなシェルスクリプト(shかksh)を作成したいのですがどのように組めば良いでしょうか? ビープ音を鳴らす方法はわかったのですが(echo '\007\c')、改行コードが含まれているか判別する方法が分かりません。

  • CSVファイルの改行コード判別

    CSVファイルをLine Inputメソッドで1行毎に読み込みたいのですが、 セル内の改行により、1行分として読み込む事ができません。 セル内の改行コードは「vbLf」が使用されているとの認識でいますが、 仮に「vbLf」が改行コードとして使用されていれば、メモ帳などで 開くと「vbLf」の部分は改行されないと思っています。 ところが、問題のCSVをメモ帳で開くとセル内改行部分も改行されて 表示されます。 Line Inputメソッドの1行分は、改行コード「vbCrLf」までで、 改行される位置がメモ帳で開いた結果と同じになります。 そうなると、セル内の改行に使用されている改行コードに何が 使用されているのでしょうか? 環境は、Windows7、EXCEL2013です。

  • 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
  • CSVファイルデータ0件時の改行コード

    CSVファイルのデータが0件のとき、そのCSVファイルをテキストエディタで開くと、1件目に改行コードが設定されています。 CSVファイルデータ0件のとき、改行コードを削除することは出来るのでしょうか? テキストエディタで開いた場合、「EOF」が1件目になるようにしたいのですが。。。。

  • テキストファイルから改行コードを削除して読込む方法

    ExcelエクセルVBAマクロについてテキストファイルから改行コードを取り除いて 変数に読み込む方法について確認させてください。 下記のVBAログラムはWordファイルをテキストファイルに落としたファイルを変数aに 読み込んでいます。 このとき、読み込んだテキストファイルはWordファイルをテキストファイルに 落とし込んだファイルなので改行コードが残ってしまいます。 この改行コードを削除したうえで変数aに読み込みたいのですが可能でしょうか。 改行コードはメモ帳では「↓」と下矢印に似た文字で表示されます。 (実際には下矢印ではないようです。) 今のところ、Replace関数で改行コードを削除するプログラムを 考えているのですが、改行コードのVBAでの表現方法が分からないので 先に進むことが出来ません。いい案があればぜひご教授下さい。 あるいはほかの方法でも改行コードが削除出来れば結構です。 またこの変数aに読み込んである文字列からかぎカッコの内部にある文字を 抽出してエクセルの行方向に出力する方法があればご教授頂ければ幸いです。 例えば “あなたは「こんにちは」と言いました。 私は「元気ですか」と聞きました。” が文字列aに読み込んである場合、“こんにちは”、“元気ですか”を抽出して エクセルに順に出力という方法です。 色々と書きましたが、よろしくお願いいたします。 以下、VBAプログラム本文です。 ---------------------------------- Sub sample1() Dim a As String a = CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Readall CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Close End Sub

このQ&Aのポイント
  • 84歳の一人暮らしの母に突然の電話があり、東京電力からの乗り換えを勧められました。母は状況を理解せずに応じ、請求書も届いてしまったそうです。
  • 高齢の母の電話対応で一方的に流されてしまったのか懸念しています。私は元の東京電力に戻すよう手続きをしましたが、相手の電力会社からの連絡を待っています。
  • 母にも一部の責任があると思いますが、このような対応について何かアドバイスやお気づきの点があれば教えてください。困っています。
回答を見る

専門家に質問してみよう