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个字符...我很震惊...!
有任何想法吗?!?
来自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)
我知道这是一个老话题,但由于有人可能像我一样尝试找出解决方案,以下是解决方法。
打开记事本(在我的例子中,我使用记事本++)并创建一个新文件。
将所有数据复制/粘贴到新文件中。
将其保存为“所有类型”并自行添加“.csv”。
该文件应保存为无 BOM,您可以使用 PHP 读取 CSV 文件进行处理。