ここから本文です

以下のPHPはttt.txtをcsvに変換するPHPですが、 ダブルクォーテーションの中にス...

アバター

ID非公開さん

2018/2/2215:24:13

以下のPHPはttt.txtをcsvに変換するPHPですが、
ダブルクォーテーションの中にスペースが含まれていると、
ダブルクォーテーションが削除されません。

ダブルクォーテーションを削除するにはどうすればよいのでしょうか?


ttt.txt
"namae";"nan rei";"ken";
"tanaka";"33";"tokyo";
"sasaki";"43";"kyoto";
"tanimura";"76";"saga";



save.csv("nan rei"のダブルクォーテーションを削除したい)

namae,"nan rei",ken
tanaka,33,tokyo
sasaki,43,kyoto
tanimura,76,saga



<?php
$fpi = fopen('ttt.txt', 'r');
$fpo = fopen('save.csv', 'w');

while (($data = fgetcsv($fpi, 1024, ';')) !== false) {
// 最終データが空文字列だったら削除
$last = count($data) - 1;
if ($data[$last] === '') { array_pop($data); }
fputcsv($fpo, $data);
}
fclose($fpi);
fclose($fpo);

閲覧数:
67
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

shi********さん

2018/2/2215:51:07

「CSVに変換する」のですよね?基本的に各要素が二重引用符で括られていても困ることはないハズですが、CSVファイルをどういう用途で使う予定なのでしょうか?

これを除去しようとすれば、要素ごとに括る必要があるかどうか(改行やカンマや二重引用符が含まれていないか)をチェックして、必要なら自分で括って(データ内の二重引用符は二重化する)impldoeでカンマ区切りで繋ぐしかなくなります。

本当にそこまでして二重引用符を除去しないといけない仕様なんでしょうか?



<ぼそ>
空白が改行やカンマと同じ扱いなのはアレですが、プログラミング言語によっては(二重引用符で括っていないと)空白が自動的に(カンマと同様に)区切り文字扱いになる言語もありますからねぇ(その昔、相当悩んだ記憶が・・・)
</ぼそ>

  • アバター

    質問者

    ID非公開さん

    2018/2/2216:30:16

    すみません。

    csvで保存したものをサイトで表示しているのですが、
    ダブルクォーテーションも表示されてしまうため、
    削除しようと思っていました。


    多くの場合、ダブルクォーテーションは削除しないほうが良いということでしょうか?



  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

アバター

質問した人からのコメント

2018/2/23 16:56:46

解決しました。

表示する際explodeではなく、
fgetcsvで表示することでダブルクォーテーションが表示されなくなりました。

ありがとうございます。

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

tez********さん

2018/2/2311:39:51

> "nan rei"のダブルクォーテーションを削除したい
fputcsv() で出力すると、二重引用符を削除すると勘違いされる恐れがあるとの判断で付加されてしまうのでしょう。

fputcsv() を使用しながら回避する手段は今のところ無いので、別の方法で書き出す必要があります。
単純なのは、implode() で1行分を生成し、fwrite() で出力すれば良いでしょう。
__使用方法は公式マニュアルをご覧ください


> csvで保存したものをサイトで表示しているのですが、
> ダブルクォーテーションも表示されてしまう
> ダブルクォーテーションは削除しないほうが良いということでしょうか?
CSV という書式はザックリとしたものなので、処理系によって挙動が異なります。
誤解が生じ難い様に一般的であると思われる方法で書く、または、実際に利用するモノに適した形にするという事になると思います。

他でも使うのなら、CSV ファイル上では残しておいて、サイトで表示する際に二重引用符を削除してから表示(trim() を使えば簡単ですね)をするというのが現実的でしょう。

他で使わないのなら、fgetcsv($fpi, 1024, ';') で読みだしたモノには(各項の前後の)二重引用符は存在しませんから、質問者さんの期待する値となっているはずです。
わざわざ別ファイルにする必要もありませんから、単にそれを表示すれば良いでしょう。

質問者さんがどの様に使うかが一番の問題です。



ご提示のスクリプト(shimix703さん のご提案のモノでしょうが)には状況によって非常に都合の悪い部分が有ります。

> $fpi = fopen('ttt.txt', 'r');
> while (($data = fgetcsv($fpi, 1024, ';')) !== false) {
この様にすると、ttt.txt のオープンに失敗した場合、$data は null となってしまい、!== false と厳密な比較をしているのが原因で無限ループとなってしまいます。
__例えばファイル名を間違えたとか...

公式マニュアルにもある様に、fopen() の返り値をキチンとチェックするのが適切でしょう。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる