質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2192閲覧

PHPで「+ - " ' 」などの記号をCSVファイルで文字列として出力を行いたい場合

yowayowanitohei

総合スコア31

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/05/18 05:39

編集2021/05/18 05:43

PHPにて、CSVファイルの出力を行う処理を作成しているのですが、
以下のものをエクセルでうまく出力する方法をお伺いしたいです。

「0123456789」 → 0が省略されてしまう
「+abcdefg」 → 計算式と判断されエラーになる
「"お名前"」 → ”がうまく出てくれない

また、このファイルはダウンロードできるだけでなく、
アップロードするファイルと共有にしたいのでできるだけ元の値を保持したいです。

php

1//CSV出力 2$filename = "出力ファイル".".csv";; 3$csvheader = ["no","ID","名前","カテゴリー","備考"]; 4$cnt = 1; 5$f = fopen($filename, "w"); 6mb_convert_variables('SJIS', 'UTF-8', $csvheader); 7fputcsv($f, $csvheader); 8if ( $f ) { 9 for($i = 0; $i < count($list); $i++){ 10 $line = [$cnt,$list[$i]->id,$list[$i]->name,$list[$i]->cate,$list[$i]->info]; 11 mb_convert_variables('SJIS', 'UTF-8', $line); 12 fputcsv($f, $line); 13 $cnt++; 14 } 15} 16fclose($f);

・試したこと

値の出力の際に 「=""」を追加して文字列だと認識されるように追加しました。

$line = [$cnt,'="'.$list[$i]->id.'"','="'.$list[$i]->name.'"',・・・(以下略)];

この場合だと0が省略されないようになり、
+-などの記号で計算が行われることがなくなりましたが、
「”」が値の中に入っている場合「=""」が表示されてしまい値としては正しくないものになってしまいました。

また、アップロードする際は「=""」が入らないようにしたいと考えております。
理由としてはエクセルでcsvに値を追加する場合、
毎回「=""」を入力しなければならない状態を避けたいためになります。

出力と入力でcsvの値を崩さない方法や
参考になるドキュメントなどご存知でしたらお伺いしたいです。。。

拙い質問で大変申し訳ございません。
お手数をおかけしますが、どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2021/05/18 11:42

直接 Excel ファイルを生成したら? SYLK 形式っててもあるけど知らない人がとまどいそうかなあ。
yowayowanitohei

2021/05/19 06:28

takasima20様 ご回答ありがとうございます。今回の実装につきましては、 csvの形式が指定されているため他ができずに困っていました。 txtでなんとか組み立ててエクセル表示とかだとうまく行けそうなものなのですが。。。 csvの奥深さに気づいた次第です。
guest

回答3

0

「”」が値の中に入っている場合「=""」が表示されてしまい値としては正しくないものになってしまいました。

ExcelのCSVでは引用符の中の引用符は2つ重ねることになっていますので、
データ中の"""に置換した上で、前後に=""を付ければ良いかと思います。

あとは、拡張子をtxtに変えるなどしてExcelで読む時に全体をテキストとして読み込んでから、区切り位置機能で分割するかですね。

投稿2021/05/18 06:20

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yowayowanitohei

2021/05/19 06:29

otn様 ご回答ありがとうございます。 ""の置換が必要なのですね!符号がついた場合でも表示させることができました!
guest

0

ベストアンサー

エクセルで直接CSVを読むときの問題なので、エクセル側で読み方を
工夫する気がないなら、出力側で調整するしかないでしょう

CSV

1="0123456789" 2="+abcdefg" 3"""お名前"""

投稿2021/05/18 06:03

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yowayowanitohei

2021/05/19 06:28

yamabejp様 ご回答ありがとうございます。 やはり出力である程度加工が必要そうですね。 そちらのソースで間違いなく動作すること確認できました。
guest

0

yamabejp様 otn様  takasima20様 (回答順) 

ご回答ありがとうございました。
それぞれのアドバイスをもとに出力での調整をおこないなんとか実装できました。
計算記号や符号などをエクセルで表示できるようにするための方法について、
csvをアップロード・ダウンロードする場合それぞれのケースだと解説されている記事も多いのですが、
アップロードファイルとダウンロードファイルが同一の仕様の解説が他に見当たりませんでしたので
今回の解決策のみ簡潔にまとめさせていただきます。


今回の流れとしては以下を想定しておりました。

1.以下のようなcsvでWebアプリからダウンロードする

csv

1no,code,name,category,call 21,+312,スタジオ"smpl",store,0120123456 32,-123,漁港"minato",city,01201122334 43,z906,建設"hoge",store,0123456789

それぞれの行で+-や符号などが入っており、そのままエクセルで読み込むとname?となってしまいます。

ご指摘を受けて、出力の際に「=" "」を付け、
既存の符号の場合は"を""に置換するようにしました。

php

1//CSV出力 2$filename = "出力ファイル".".csv";; 3$csvheader = ["no","code","name","category","call"]; 4$cnt = 1; 5$f = fopen($filename, "w"); 6mb_convert_variables('SJIS', 'UTF-8', $csvheader); 7fputcsv($f, $csvheader); 8if ( $f ) { 9 for($i = 0; $i < count($list); $i++){ 10 //「"」を置換 11 $list[$i]->name = str_replace('"', '""', $list[$i]->name); 12 //「=" "」を挿入 13 $line = [$cnt,'="'.$list[$i]->code.'"',$list[$i]->name,$list[$i]->cate,'="'.$list[$i]->call.'"']; 14 mb_convert_variables('SJIS', 'UTF-8', $line); 15 fputcsv($f, $line); 16 $cnt++; 17 } 18} 19fclose($f);

_

2.ダウンロードしたcsvにデータを追記しwebアプリにアップロードする

出力のみだとこれで終了なのですが、csvファイルをもとにアップロードを実施する場合、
純粋なデータに加工のため挿入した「=" "」が邪魔になり、置換によってデータが変になってしまいます。
そのため、アップロード処理で挿入した「=" "」を削除し、置換を戻す処理を追加しました。

php

1 foreach($list as $val){ 2 $listSet = explode(",", $val); 3 4 //エクセルでの表示設定を解除する 5 if(strpos($listSet[1],'="') !== false){ 6 $listSet[1] = str_replace('"=""', '', $listSet[1]); 7 $listSet[1] = substr($listSet[1], 0, -3); 8 } 9 $listSet[1] = str_replace('""""', '"', $CategorySet[1]); 10 11 $ary_placeholder[] = " (?, ?, ?, ?)"; 12 $ary_value[] = $listSet[1]; 13 $ary_value[] = $listSet[2]; 14 $ary_value[] = $listSet[3]; 15 $ary_value[] = $listSet[4]; 16 } 17

上記のようにアップロードファイルとダウンロードファイルの共通化を行う場合に
エクセルからの表示も、正しいデータのアップロードも行うことができました。

投稿2021/05/19 06:54

yowayowanitohei

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問