我对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个字符......我我非常震惊......!
有什么想法吗?!?
答案 0 :(得分:1)
我知道这是一个古老的话题,但是有人可能会像我一样试图找出解决方案,这里有解决方法。
打开记事本(在我的情况下,我使用notepad ++)并创建一个新文件
复制/粘贴新文件中的所有数据
保存为"所有类型"并添加" .csv"你自己。
该文件应该没有BOM保存,您可以使用PHP读取CSV文件进行处理。
答案 1 :(得分:1)
使用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;
}