こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

ダブルクォーテーションつきでCSV出力したい

今、PHPを勉強しています。
PHPでデータベースからとりだした配列を、CSVファイルに出力するサンプルプログラムをみつけました。
https://blog.supersonico.info/?p=869

このプログラムをそのまま実行すると、
CSVファイルに、
あああ,いいい,ううう,えええ
かかか,ききき,くくく,けけけ
と出力されます。

これを、ダブルクォーテーションつきで、
"あああ","いいい","ううう","えええ"
"かかか","ききき","くくく","けけけ"
と出力するにはどうすればいいのでしょうか?

*****************************************
$csvFileName = '/tmp/' . time() . rand() . '.csv';
$res = fopen($csvFileName, 'w');
if ($res === FALSE) {
throw new Exception('ファイルの書き込みに失敗しました。');
}
$dataList = array(
       //↓ここにダブルクォーテーションで囲ってもうまくいかない。↓
array('あああ','いいい','ううう','えええ'),
array('かかか,'ききき','くくく','けけけ'),
);
foreach($dataList as $dataInfo) {
mb_convert_variables('SJIS', 'UTF-8', $dataInfo);
fputcsv($res, $dataInfo);
}
fclose($res);

投稿日時 - 2017-05-18 23:12:07

QNo.9330919

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

質問者さんは何がしたいのでしょうか?

提示されたような文字列を『CSVファイルに出力する』だけであれば、ダブルクォーテーションで括る必要はありません。ダブルクォーテーションで括らないといけないケースでは、fputcsvが自動的にダブルクォーテーションで括って出力します。この処理を自前でやらなくていいのがfputcsvの便利なところです(正しいCSV出力ってけっこう面倒なんですよ・・・)。

(例)
<?php
$res = fopen('test.csv', 'w');
$dataList = array(
array('あああ', 'いいい', 'ううう', 'えええ'),
array('かかか', 'き,き,き', 'く く く', 'け"け"け'),
array('"さささ"', '"ししし"', '"すすす"', '"せせせ"'),
);
foreach($dataList as $dataInfo) {
mb_convert_variables('SJIS', 'UTF-8', $dataInfo);
fputcsv($res, $dataInfo);
}
fclose($res);

とすれば、出力結果は

あああ,いいい,ううう,えええ
かかか,"き,き,き","く く く","け""け""け"
"""さささ""","""ししし""","""すすす""","""せせせ"""

となります。空白やカンマやダブルクォーテーションや改行コードを含んで要れば自動的にダブルクォーテーションで括られますし、文字列中のダブルクォーテーションはエスケープのために "" と2重になるのが「正しいCSV」です。



ちょっと思ったのですが、まさかCSVファイルをMS-Excelで開いて確認していたりはしませんよね?MS-Excelで開くと括っているダブルクォーテーションは除去されてセルの値になります。∴ エディタで開いて確認しないと意味がありません。

投稿日時 - 2017-05-19 08:26:22

ANo.1

>//↓ここにダブルクォーテーションで囲ってもうまくいかない。↓
という意味は?
質問では 'あああ' とシングルクォーテーションで囲っただけですが、
添付画像のようにダブルクォーテーションで囲ってもうまくいかない、という意味なのでしょうか?
array('"あああ"','"いいい"','"ううう"','"えええ"'),

投稿日時 - 2017-05-19 02:35:44

補足

はい。ご指摘のようにすると、
”””あああ”””,”””いいい”””,”””ううう”””,”””えええ”””

このように3つのダブルクォーテーションでくくられてしまいます。
なんとかひとつのダブルクォーテーションで囲われるようにしたいのです。
わかりますか?

投稿日時 - 2017-05-20 11:05:44