fgetcsv无法正确识别转义字符

时间:2016-01-19 16:25:48

标签: php csv fgetcsv

我有一个CSV字符串文件,如下所示:

"12345","445 Maple St.","Going to the "orange" store","610-123-4567"

我正在使用以下内容解析每一行:

while (($data = fgetcsv($file_matters, 500, ',', '"', '"')) !== FALSE)

而不是像这样得到一个数组:

array(4) (
  [0] => (string) 12345
  [1] => (string) 445 Maple St.
  [2] => (string) Going to the "orange" store
  [3] => (string) 610-123-4567
)

我得到了:

array(4) (
  [0] => (string) 12345
  [1] => (string) 445 Maple St.
  [2] => (string) Going to the orange" store"
  [3] => (string) 610-123-4567
)

请注意不正确的双引号。它们应像"orange"一样缠绕在橙色上,但正如你所看到的,它们不是。我正在使用fgetcsv的第五个参数,它应该自动转义双引号。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我不确定您的CSV实际上是否有效;例如,这将是有效的:

"12345","445 Maple St.",Going to the "orange" store,"610-123-4567"

您的摘录无效,因为"内有"

CSV NOT 要求所有字段都用引号括起来,PHP也可以处理带有不带引号的块的CSV行。

php > var_dump(
    >    str_getcsv('"12345","445 Maple St.",Going to the "orange" store,"610-123-4567"')
    > );
array(4) {
  [0]=>
  string(5) "12345"
  [1]=>
  string(13) "445 Maple St."
  [2]=>
  string(27) "Going to the "orange" store"
  [3]=>
  string(12) "610-123-4567"
}

答案 1 :(得分:1)

您只需从csv文件中获取数据并使用(,)。然后使用trim()函数删除双引号,如下所示。我希望,我解决了你的问题。

Book1.csv

"12345","445 Maple St.","Going to the "orange" store","610-123-4567"

,代码是

<?php
   $row = 1;
   $handle = fopen("Book1.csv", "r");
   while (($data = fgetcsv($file_matters,500, ",")) !== FALSE) {
      $num = count($data);
      $row++;
      for ($i=0; $i < $num; $i++) {
      $hh=$data[$i];
          $a[]=trim($hh,'"') ;// remove "" and save in a array
     // $a=trim($hh,'"') ;
          //echo$a. "<br />\n";
      }
   }
   fclose($file_matters);
   print_r($a);
?>

结果

Array ( [0] => 12345
        [1] => 445 Maple St.
        [2] => Going to the "orange" store
        [3] => 610-123-4567 ) 

答案 2 :(得分:0)

在CSV中,您需要转义内容。

$csvContent = str_replace(' "', ' \"', $csvContent);
$csvContent = str_replace('" ', '\" ', $csvContent);