fgetcsv()错误地将双引号添加到第一行的第一个元素

时间:2015-04-23 15:51:56

标签: php double-quotes fgetcsv

我对fgtcsv()有一个非常好奇的问题。看看这段代码

  $csv_check = fopen(CSV_DIR.$this->db_table.".csv","r");
  $data = fgetcsv($csv_check, 1000, $this->fields_terminated_by);
  fclose($csv_check);

print_r($ data)输出以下内容:

array (
0 => '"program_id"',
1 => 'program_name',
2 => 'program_logo',
)

奇怪的是,$ data [0]在这里是双引号...此CSV文件中的原始行如下所示:

"program_id";"program_name";"program_logo"

我根本得不到它...用strlen($ data [0])计算$ data [0]的字符会返回15,即使错误引用,它也必须是12个字符......我我非常震惊......!

有什么想法吗?!?

2 个答案:

答案 0 :(得分:1)

我知道这是一个古老的话题,但是有人可能会像我一样试图找出解决方案,这里有解决方法。

打开记事本(在我的情况下,我使用notepad ++)并创建一个新文件 复制/粘贴新文件中的所有数据 保存为"所有类型"并添加" .csv"你自己。
该文件应该没有BOM保存,您可以使用PHP读取CSV文件进行处理。

答案 1 :(得分:1)

来自PHP.net notes

  

使用BOM表字符时,fgetscsv可能会出现第一个元素用“双引号”引起来的情况。忽略它的最简单方法是在使用fgetcsv之前将文件指针前进到第4个字节。

<?php

// BOM as a string for comparison.
$bom = "\xef\xbb\xbf";

// Read file from beginning.
$fp = fopen($path, 'r');

// Progress file pointer and get first 3 characters to compare to the BOM string.
if (fgets($fp, 4) !== $bom) {
    // BOM not found - rewind pointer to start of file.
    rewind($fp);
}

// Read CSV into an array.
$lines = [];
while (!feof($fp) && ($line = fgetcsv($fp)) !== false) {
    $lines[] = $line;
}