使用下面的代码,我可以从CSV文件创建一个关联数组。 它工作正常,唯一的问题是,每行的第一个键都用双引号(“)保存,我不明白为什么。
/* Map Rows and Loop Through Them */
$rows = array_map(function($row) { return str_getcsv($row, ';', '"'); }, file('test.csv'));
$header = array_shift($rows);
$csv = array();
foreach($rows as $row) {
$csv[] = array_combine($header, $row);
}
echo "<pre>";
print_r($csv);
echo "</pre>";
当我打印时,我得到了
Array
(
[0] => Array
(
["TEST"] =>
[EMAIL] => mail@test.com
[NAVN] => Donald Duck
[ADDRESSE] => Paradisæblevej 111
[POSTNRBY] => 1234 Andeby
[TELEFON] => 12345678
[TUR] => 49
[TURNAVN] => Title
[ANTAL] => 1
[BELOEBIALT] => 695
[BONKODE] => 99900714
)
[1] => Array
(
["TEST"] =>
[EMAIL] => mail@test.com
[NAVN] => Donald Duck
[ADDRESSE] => Paradisæblevej 111
[POSTNRBY] => 1234 Andeby
[TELEFON] => 12345678
[TUR] => 49
[TURNAVN] => Title
[ANTAL] => 1
[BELOEBIALT] => 695
[BONKODE] => 99900714
)
)
我的标题如下:
"TEST";"EMAIL";"NAVN";"ADDRESSE";"POSTNRBY";"TELEFON";"TUR";"TURNAVN";"ANTAL";"BELOEBIALT";"BONKODE"
CSV文件如下所示:
"TEST";"EMAIL";"NAVN";"ADDRESSE";"POSTNRBY";"TELEFON";"TUR";"TURNAVN";"ANTAL";"BELOEBIALT";"BONKODE"
"";"mail@test.com";"Donald Duck";"Paradisæblevej 111";"1234 Andeby";"12345678";"49";"Title";"1";"695";"99900714"
"";"mail@test.com";"Donald Duck";"Paradisæblevej 111";"1234 Andeby";"12345678";"49";"Title";"1";"695";"99900714"
请注意“测试”中的引号... 我该如何解决?
谢谢
答案 0 :(得分:2)
这是一个猜测:您的文件以Unicode BOM(字节顺序标记)开头,该文件是不可见的,但使str_getcsv
确信此单元格不是用引号引起来的。
要测试它:在编辑器中打开csv文件,并将其另存为Latin-1或任何其他8位编码。问题应该消失了(但是您可能会破坏内容)。
要修复此问题:理想情况下,打开文件时应指定正确的编码(utf-8?)。但是,PHP似乎并未定义UTF-8 + BOM编码。因此,您可以尝试将this问题的答案中的(丑陋)解决方案应用于大约相同的问题。 (或者您可以切换到Python,它的编码为utf-8-bom
:-P)