массивы — проблема с отделкой ()

Контекст:

Я спасаю .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>');

-1

Решение

$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')

  1. Вам нужно trim каждое отдельное значение после у тебя есть explodeд линия, не раньше:

    $keys = array_map('trim', $keys);
    
  2. Вы должны использовать функции разбора CSV для разбора CSV, а не заново изобретать колесо:

    $keys = str_getcsv($file[0], ';');
    
  3. Вы должны проанализировать весь файл 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 полностью.

2

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

Других решений пока нет …

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