PHP CSV-Upload UTF-8 (с и без спецификации)

Может кто-нибудь объяснить мне разницу — и как распознать или изменить формат?

У меня есть простая HTML-форма для загрузки, и после загрузки я анализирую содержимое файла с помощью 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"}
}

var_dump () показывает мне (по-видимому) точно такой же дамп, когда я использую файлы с или без спецификации, но когда я делаю простой цикл над этим массивом и проверяю, пуст ли OrderId (первое поле в CSV) — это всегда терпит неудачу, когда CSV кодируется без спецификации. Когда я сохраняю тот же файл с BOM — все работает нормально.

foreach ($data as $position) {
$orderid = $position["OrderId"];
if (empty($orderid)) die('No orderid found');
}

И это только первое поле — остальные поля в порядке.

1

Решение

Нашел это сам. Не знаю, элегантно ли это — но это работает …

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;
}
0

Другие решения

Фон:

Без моего ведома я был в такой же ситуации. Я понял это только тогда, когда я не мог использовать данные, которые я импортировал из CSV-файлов.

Проблема:

При импорте двух столбцов из файла CSV я не смог получить доступ к данным в первом столбце массива:

array() => ['project_nr' => '0000000', 'project_name']

Я старался:

array_keys($myArray);

И все заработало, как и ожидалось, но до дальнейшего анализа я не увидел, что в первом столбце project_nr было 13 символов, а не 10 символов. Который я позже понял, что это была спецификация

Решение:

$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);
}

Ссылка:

Вот где я нашел решение

Анекдот:

Я разместил это решение здесь в надежде соединить поиски Google, так как он не может получить доступ к определенным ключам в массиве, к загрузке CSV в BOM UTF8 (это то, что мне было нужно, и я не смог найти). Я надеюсь, что, возможно, это поможет какой-то отчаянно ищущей душе.

0

По вопросам рекламы [email protected]