php - 使用 fgetcsv() 解析 csv(用引号包裹的数据)无法正常工作

标签 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 有什么问题?有没有人遇到过这样的问题?

最佳答案

我认为您需要定义一个文本限定符,这在 fgetcsv 中称为附件. 例如:

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

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

你应该能够做到:

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

更新:

You problem with the file opening oddly, is probably related to the files encoding, by creating a new file, you created it with a new encoding maybe ANSI/UTF-8/Unicode something the original file wasnt, and then copied the content in there, so now it was saved in that format instead.. im not sure why this would give you the problems you are experiencing, but im assume the parser somehow cant handle the wrong encoding.

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

关于php - 使用 fgetcsv() 解析 csv(用引号包裹的数据)无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8294550/

相关文章:

php - AJAX 未正确发送数据

PHP和PDO类问题

javascript - 隐藏文件上传按钮

PHP 以数组形式读取特定的 csv 文件列

php - 删除 CSV 中的第一行,然后保存覆盖现有文件

php - 当用户点击浏览器的后退按钮时将用户重定向到一个页面

PHP 登录全部大写

php - fgetcsv - 对第一列值执行函数?

php - 读取大文件时出现内存不足错误