有人可能会解释我的区别 - 以及如何识别或更改格式?
我是一个简单的HTML-Upload-Form,上传后我用fgetcsv()解析文件内容。在解析之后我就像这样的数组
array(2) {
[0]=>
array(9) {
["OrderId"]=>
string(13) "FG-456887"
["Product"]=>
string(7) "B9876"
}
[1]=>
array(9) {
["OrderId"]=>
string(13) "FG-852562"
["Product"]=>
string(7) "B9877"
}
}
当使用带或不带BOM的文件时,var_dump()显示我(显然)完全相同的转储,但当我在这个数组上做一个简单的循环并检查OrderId(CSV中的第一个字段)是否为空 - 这在没有BOM的情况下编码CSV时总是会失败。当我用BOM保存同一个文件时 - 一切正常。
foreach ($data as $position) {
$orderid = $position["OrderId"];
if (empty($orderid)) die('No orderid found');
}
它只是第一个字段 - 其他字段都可以。
答案 0 :(得分:0)
自己找到它。不知道,如果它很优雅 - 但它有效......
function remove_utf8_bom($text) {
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
function csv_to_array($filename='', $delimiter=';', $seperator = '"') {
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$csvdata = file($filename);
$header = NULL;
$data = array();
foreach ($csvdata as $line) {
$row = remove_utf8_bom($line);
$row = str_getcsv($row,$delimiter,$seperator);
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
return $data;
}
答案 1 :(得分:0)
背景:
我不知道我处于同一情况。我只有在无法使用从csv文件导入的数据时才意识到这一点。
问题:
从CSV文件导入两列时,我无法访问数组第一列中的数据:
array() => ['project_nr' => '0000000', 'project_name']
我尝试过:
array_keys($myArray);
它按预期工作,但是直到进一步分析,我才发现第一列'project_nr'是13个字符而不是10个字符。后来我才意识到正在读BOM。
解决方案:
$str = file_get_contents('yourfile.utf8.csv');
$bom = pack("CCC", 0xef, 0xbb, 0xbf);
if (0 === strncmp($str, $bom, 3)) {
echo "BOM detected - file is UTF-8\n";
$str = substr($str, 3);
}
参考:
Here is where I found the solution
轶事:
我在这里放置了此解决方案,希望将google搜索与无法访问数组中的特定键关联到BOM UTF8 CSV上载。(这是我需要的,但无法找到),我希望可能为一些拼命寻找灵魂的人提供帮助。