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""。我所做的是,复制了整个文件内容并创建了一个具有相同名称的新 csv 文件,令我惊讶的是,它起作用了。

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

我的问题是,.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 回答