Я спасаю .csv
файл «ключи«(первая строка) в array $CSV
получить многомерный массив файла.
Ключи, содержащие несколько слов, сохраняют свои первый и последний пробелы как первый и последний символ. Файл закодирован в Windows-1252
который я конвертирую в UTF-8
,
$keys = mb_convert_encoding($keys, 'UTF-8', 'Windows-1252');
$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);
Вот первые 2 ключа, второй сохраняет свои пробелы.
Начальный процесс (ключ => значение):
[Commande] => C......
[ Date de création ] => 01/01/1970
С помощью urlencode(substr($keys[$j], 0, 1))
как значение:
[Commande] => C
[ Date de création ] => +
С помощью rawurlencode(substr($keys[$j], 0, 1))
как значение:
[Commande] => C
[ Date de création ] => %20
Используя функции, которые я нашел в других вопросах, таких как preg_replace('/\xc2\xa0/', '', $keys)
всегда выводит %20
,
Я мог бы пропустить эту проблему или работать по-другому, но я не понимаю, почему я не могу trim()
эти строки.
$file = file(__DIR__ . '/path/to/' . $csv_file);
// Keys
$keys = mb_convert_encoding($file[0], 'UTF-8', 'Windows-1252');
$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);
$CSV = [];
for ($i = 1; $i < count($file); $i += 1) {
$values = explode(';', $file[$i]);
for ($j = 0; $j < count($values); $j += 1) {
$values[$j] = mb_convert_encoding($values[$j], 'UTF-8', 'Windows-1252');
$values[$j] = trim(str_replace('"', ' ', $values[$j]));
$values = array_combine($keys, $values);
$CSV[] = $values;
}
}
die('<pre>' . print_r($CSV, true) . '</pre>');
$keys = trim(str_replace('"', ' ', $keys)); $keys = explode(';', $keys);
Предположительно, вы начинаете с этой строки:
Commande;"Date de création";"Something something"
Затем вы превращаете его в эту линию (вы введения пробелы здесь):
Commande; Date de création ; Something something
Который вы затем обрезаете (удаляя пробелы в начале и конце строки):
Commande; Date de création ; Something something
А также затем вы взрываете линию:
array('Commande', ' Date de création ', ' Something something')
Вам нужно trim
каждое отдельное значение после у тебя есть explode
д линия, не раньше:
$keys = array_map('trim', $keys);
Вы должны использовать функции разбора CSV для разбора CSV, а не заново изобретать колесо:
$keys = str_getcsv($file[0], ';');
Вы должны проанализировать весь файл CSV, используя fgetcsv
для большей эффективности:
function read_and_convert_line($fh) {
$values = fgetcsv($fh, 0, ';');
if (!$values) {
return false;
}
return array_map(
function ($value) { return mb_convert_encoding($value, 'UTF-8', 'Windows-1252'); },
$values
);
}
$fh = fopen(__DIR__ . '/path/to/' . $csv_file);
$headers = read_and_convert_line($fh);
$data = [];
while ($row = read_and_convert_line($fh)) {
$data[] = array_combine($headers, $row);
}
fclose($fh);
print_r($data);
Это должно устранить необходимость trim
полностью.
Других решений пока нет …