3

データが次のような形式で指定されている csv ファイルを解析しようとしています。

"Total","Shazam (DE)","Total",,"215,611","538","£935.97","£60.77"

ここで、以下のような fgetcsv() を指定すると:

$values = fgetcsv($f,8098);

次のように配列を返します:

array(9) {
  [0]=>
    string(15) ""Total""
  [1]=>
    string(27) ""Shazam (DE)""
  [2]=>
    string(15) ""Total""
  [3]=>
    string(1) ""
  [4]=>
    string(9) ""215"
  [5]=>
    string(9) "611""
  [6]=>
    string(11) ""538""
  [7]=>
    string(19) ""£935.97""
  [8]=>
    string(19) ""£60.77"
 "
 }

しかし今、次のようなifステートメントを与えると:

 $values = fgetcsv($f,8098);
 if ($values[0] == "Total")
   echo "Hello";

何もエコーしていません。なぜ条件が満たされていないのですか? 囲み引用符と関係がありますか?

私は引用符をエスケープしようとさえしました。

 if ($values[0] == '\"Total\"')
   echo "Hello";

しかし、役に立たない。

このために .ini 設定を変更する必要がありますか? 私を助けてください。

編集: var_dump を実行してみましたが、引用符を含む値が表示されました:

 array(9) {
  [0]=>
   string(15) ""Total""
 [1]=>
   string(27) ""Shazam (DE)""
 [2]=>
   string(15) ""Total""
 [3]=>
   string(1) ""
 ...
}

それでも

$values[0] == "\"Total\""

うまくいきませんでした。正しいコンパレータは何ですか?

更新: 目的のない試行錯誤の数時間後、最終的に厄介な問題が見つかりましたが、問題は解決しました。

最初に、csv ファイルを開こうとしたときに、コンテンツとしてÿþD""を含むメモ帳が開きました。私がしたことは、filecontent 全体をコピーし、同じ名前の新しい csv ファイルを作成したことです。驚いたことに、それは機能しました。

古いファイルは MS-EXCEL/NOTEPAD では問題なく開くことができましたが、Excel では各行が 1 つのセル内に表示されていました。

私の質問は、.csv fromat の問題は何でしたか? 誰もそのような問題に遭遇したことがありますか?

4

1 に答える 1

2

テキスト修飾子を定義する必要があると思います。これはfgetcsvのエンクロージャと呼ばれます。例えば:

$values = fgetcsv($f,8098,'"'); 
// the last part is: singlequote doublequote singlequote,
// you could also use an escape "\"" 

これは、パーサーに、テキスト領域内のコンマを使用しないように指示するためです。

あなたはできるはずです:

$values[0] == '"Total"'

アップデート:

ファイルが奇妙に開くという問題は、おそらくファイルのエンコーディングに関連しています。新しいファイルを作成することで、新しいエンコーディングで作成した可能性があります ANSI/UTF-8/Unicode で、元のファイルではなかったものを作成し、そこにコンテンツをコピーしました、そのため、代わりにその形式で保存されました..なぜこれがあなたが経験している問題を引き起こすのかわかりませんが、パーサーが何らかの形で間違ったエンコーディングを処理できないと思います.

メモ帳を開いてみて、[名前を付けて保存] をクリックすると、ボタンでエンコードを選択できることに気付きます。

于 2011-11-28T10:42:58.967 に答える