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

Don*_*000 5 php fgetcsv double-quotes

我有一个非常奇怪的问题,有fgtcsv().看看这段代码

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

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

array (
0 => '"program_id"',
1 => 'program_name',
2 => 'program_logo',
)
Run Code Online (Sandbox Code Playgroud)

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

"program_id";"program_name";"program_logo"
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?!?

Mod*_*der 6

来自PHP.net 注释

当提供 BOM 字符时,fgetscsv可能会出现将第一个元素括在“双引号”中的情况。忽略它的最简单方法是在使用 之前将文件指针移至第 4 个字节fgetcsv

<?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;
}
Run Code Online (Sandbox Code Playgroud)


Pre*_*iel 1

我知道这是一个老话题,但由于有人可能像我一样尝试找出解决方案,以下是解决方法。

打开记事本(在我的例子中,我使用记事本++)并创建一个新文件。
将所有数据复制/粘贴到新文件中。
将其保存为“所有类型”并自行添加“.csv”。
该文件应保存为无 BOM,您可以使用 PHP 读取 CSV 文件进行处理。