[PHP-users 17863]Re: カンマ入りデータをCSVで出力するには

airwhite airwhite @ airwhite.net
2003年 9月 13日 (土) 01:08:33 JST


藤本さま、こんばんは。

airwhiteです。

もう自力で解決されているかもしれませんが・・・

csvデータ形式の仕様は、調べてみましたか?

古い(由緒正しい?)csvの仕様では、確か次のようだったと思います。
 数字の場合は、ダブルクォテーション(")無しでカンマ(,)で区切り
 文字列の場合は、ダブルクォテーション(")で囲みカンマ(,)で区切る。

しかし、エクセルでは、その辺のルールが少し変わっていて
 数字だろうが文字列だろうがダブルクォテーション(")無しでカンマ(,)で区切る。
 ただし、文字列に(,)がある場合に限りダブルクォテーション(")で囲む。

になっています(MS Excel 2002でCSV出力して調べました)。

古いCSVの形式でもエクセルで問題なく読み込めます。
もういないと思いますがロータスを使っている人は古いCSV形式でないと読めませ
ん。

前置きが長くなって恐縮ですが
カンマのあるデータはダブルクォテーション(")で囲みましょう。
できたら数字以外のデータもダブルクォテーション(")で囲んであげましょう。
ということです。

最初は、データベースから取ってきたデータをCSV形式で吐き出す方法が
わからないのかと思いましたが、よく読むとそうではなかったのですね。
データベースから取得した配列に入ったデータをcsvで吐き出す場合

$csv = implode(",",$db_data); // $db_data は配列。joinでも同じ。

で、カンマ付文字列に変換できますが、カンマを含むデータを考慮してません。

$data = array ( );
foreach ($db_data as $k=>$v) {
    if (preg_match("/[,]/",$d)) {
        $data[$k] = '"' . $v . '"';
    } else {
        $data[$k] = $v;
    }
}
$csv = implode(",",$data);

のような感じでカンマを含むcsvデータが作れそうですね。
デバックしてませんけど・・・



PHP-users メーリングリストの案内