使用fgetcsv()解析CSV(用引号括起来的数据)不能正常工作


parse csv (data encased withing quotes) using fgetcsv() not working properly

我正在尝试解析一个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格式的问题是什么?以前有人遇到过这样的问题吗?

我认为您需要定义一个文本限定符,这在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的东西,原来的文件不是,然后复制的内容在那里,所以现在它被保存在那个格式。我不确定为什么这会给你带来你正在经历的问题,但我假设解析器不知怎么地不能处理错误的编码。

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