使用fgetcsv()无法正常工作解析csv(数据包含在引号内)

时间:2011-11-28 10:35:14

标签: php fgetcsv

我正在尝试解析一个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“”的记事本,因为它的内容。我做的是复制整个文件内容并创建一个具有相同名称的新csv文件,令我惊讶的是,它有效。

旧文件在MS-EXCEL / NOTEPAD中打开很好,但在excel中,每行都显示在一个单元格内。

我的问题是, .csv fromat的问题是什么?有没有人在此之前解决过这样的问题?

1 个答案:

答案 0 :(得分:2)

我认为你需要定义一个文本限定符,这在fgetcsv中称为enclosure。 例如:

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

这是告诉解析器它不应该在文本区域内使用逗号。

你应该可以这样做:

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

更新:

  

你奇怪地打开文件的问题,可能与此有关   文件编码,通过创建新文件,您使用新文件创建它   编码可能是原始文件不是ANSI / UTF-8 / Unicode,然后在那里复制了内容,所以现在它以那种格式保存了。我不知道为什么这会给你遇到的问题,但即时通讯假设解析器无法以某种方式处理错误的编码。

尝试打开记事本并注意当你点击另存为时,你可以在按钮中选择编码,尝试使用不同编码的几个不同文件,如果你想确定它是吗?