textareaの内容を、改行も含めてひとつのセルにCSV出力させる問題です。


過去にWEB上で類似の質問がありますが、その方が言われているとおり、
TEXTAREAの内容には改行コードが含まれており、CSVは改行がレコードの
区切りとなっているため、何らかの対応が必要です。

現在、ひとつのセル内に出力するために、以下のようにしています。
$str = ereg_replace("\,|\r|\n","",$str);
改行、カンマをすべて置換で消しています。


○類似質問
http://ml.php.gr.jp/pipermail/php-users/2001-October/003142.html

回答の条件
  • 1人10回まで
  • 登録:2009/09/10 15:38:23
  • 終了:2009/09/17 15:40:02

回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/09/10 16:49:45

ポイント60pt

改行、カンマをすべて置換で消すというのも一つの対策ではあるのですが・・・。


【1】ダブルクォーテーションの利用

メモ帳などで下記のように改行入りのcsvファイルを作って、

Excelなどで読み込んでみてください。

"1
2
3",1
2,"あ
い
う"

上記確認していただければ理解いただけると思うのですが、

ダブルクォーテーションで囲めば改行を含んでいても1つの塊として扱われます。


【2】各アプリケーションに向けた対応

メモ帳+Excelで確認いただければ気づかれるかもしれないのですが、

1・
2・
3

のように表示される事と思います。

これは、Excelのセル内改行はLFのみなのに対して、

メモ帳で保存した際の改行がCR+LFになっているためです。

Excelは一例ですが、ご利用になるアプリケーションにあわせて、

CR+LFをLFに置換する処理などは必要になります。


【3】具体的な流れ

半角のダブルクォーテーションが混ざっていると、データが途切れたり、

複数のデータが1つになってしまったりするので、全角に置換してから、

半角で囲むという必要性があり、下記のようなステップになります。

(1)半角ダブルクォーテーションを全角に置換

(2)CR+LFをLFに置換 ←Excelのように必要であれば行う。

(3)全体を半角ダブルクォーテーションで括る


【4】備考

話はそれますのでここでは述べませんが、

HTMLタブの除去やSQLインジェクションなどへの対応も適宜行う必要があるかもしれません。

id:ikazuo

> 【3】具体的な流れ

>

> (1)半角ダブルクォーテーションを全角に置換

以下のようにして置換できました。

$str = ereg_replace("\"","”",$str);


> (2)CR+LFをLFに置換 ←Excelのように必要であれば行う。

カンマとCR(\r)+LF(\n)をLF(\n)に置換する処理です。

これで問題なく出力されました。(...たぶん)

$str = ereg_replace("\,|\r\n","\n",$str);

> (3)全体を半角ダブルクォーテーションで括る

こちらは力不足で見当もつきません...

ご教示いただけないでしょうか。

よろしくお願いいたします。

http://ml.php.gr.jp/pipermail/php-users/2001-October/003158.html
2009/09/10 18:07:02
  • id:kn1967
    (2)カンマまで改行に変換されちゃうと困るような・・・
    単純に
      $str = ereg_replace(",|\r","",$str);
    あるいは、
      $str = ereg_replace(",",",",$str);
      $str = ereg_replace("\r","",$str);
    など。

    (3)何か難しく考えすぎておられるような・・・
    単純に
      $str = '"' . $str . '"';
    など。

    1つの結果を求めるための方法がいくつもあるのは何とも言えないところなのだけど、
    「これが1番!」と決め付けるだけの決め手が無いのですよね・・・。
  • id:ikazuo
    以下の内容で問題が解決されました。

      $str = ereg_replace("\"","”",$str);      //半角のダブルクォートを全角のダブルクォートに置換
      //$str = ereg_replace("\,|\r\n","\n",$str);   //
      $str = ereg_replace(",",",",$str);       //半角カンマを全角カンマに置換
      $str = ereg_replace("\r","",$str);       //CR(\r)を空白に置換
      $str = '"' . $str . '"';            //内容を半角ダブルクォートで括る

    ありがとうございました。
  • id:KeyKey
    ダブルクォートを全角に変えてしまうとデータを変更してしまうことになります。
    用途にも依りますがWEBで表示する前提なら「"」(全角です)の様に文字コードに変換してはいかがでしょうか?

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません