Как удалить несколько пробелов в многострочном текстовом файле в PHP

У меня есть текстовый файл, содержащий строки, разделенные "\n" и пробелы между каждым элементом. Элементы разделяются одним или несколькими пробелами. Однако пробелы между элементами одинаковы для каждой строки.

FRUIT   WATER   GRE  LRG   0003 050
FRUIT   BANAN   YEL  MED   0017 010
FRUIT   STRAW   RED  SML   0005 005
FRUIT   LEMON   YEL  SML   0024 005
VEGIE   REDPE   RED  MED   0008 001
VEGIE   GRENP   GRE  MED   0009 001
BOX   RED     006 012 018
BOX   YEL     010 020 030
BOX   GRE     003 006 009
PERSON      JOHN  TALL  STRG
PERSON      JIMM  MEDM  WEAK
PERSON      DAVD  MEDM  STRG

Я пытаюсь разобрать этот файл с помощью PHP. Следующий код дает массив с большим количеством пробелов.

if(file_exists($filename)) {
        $filecontents = file_get_contents($filename);
        $lines = explode("\n", $filecontents);
        foreach ($lines as $line) {
        $exploded = explode(" ", $line);
        if (sizeof($exploded) >= 5 and $exploded[0] == 'FRUIT') $array[] = array(
            'type' => $exploded[1],
            'color' => $exploded[2],
            'size' => $exploded[3],
            'qty' => $exploded[4],
            'weight' => $exploded[5]
            );
        if (sizeof($exploded) >=5 and $exploded[0] == 'VEGIE') $array[] = array(
            'type' => $exploded[1],
            'color' => $exploded[2],
            'size' => $exploded[3],
            'qty' => $exploded[4],
            'weight' => $exploded[5]
            );
        if (sizeof($exploded) >= 5 and $exploded[0] == 'BOX') $array[] = array(
            'color' => $exploded [1],
            'largefit' => $exploded[2],
            'medfit' => $exploded[3],
            'smallfit' => $exploded[4]
            );
        if (sizeof($exploded) >= 4 and $exploded[0] == 'PERSON') $array[] = array (
            'name' => $exploded[1],
            'build'=> $exploded[2],
            'strength' => $exploded[3]
            );
        }
    }

print_r($array);

?>

person exchoki    schedule 09.03.2017    source источник
comment
непонятно, что вы спрашиваете. чтобы заменить несколько пробелов, вы можете сделать $var = preg_replace('/ +/', ' ', $var) или любой символ пробела $var = preg_replace('/\s+/', ' ', $var)   -  person Augwa    schedule 10.03.2017
comment
Спасибо, я попробую это сегодня вечером.   -  person exchoki    schedule 10.03.2017
comment
Вы уверены, что это не просто вкладка между каждым полем?   -  person Augwa    schedule 10.03.2017
comment
Я просмотрел текстовый файл с помощью редактора, который идентифицирует пробелы иначе, чем табуляции. В этом случае он показывает разделения в виде пробелов.   -  person exchoki    schedule 10.03.2017


Ответы (1)


Простой ответ: используйте trim() для всех ваших значений перед их сохранением:

'type' => trim($exploded[1]),

Но эту работу можно выполнять более эффективно с помощью регулярных выражений. Также обратите внимание, что команда file() автоматически считывает файл в массив!

<?php
if(file_exists($filename)) {
    $array = [];
    $lines = file($filename);
    foreach ($lines as $line) {
        if (!preg_match("/(\w+)\s+(\w+)\s+(\w+)\s+(\w+)(?:(?:\s+(\w+))?\s+(\w+))?/", $line, $matches)) {
            continue;
        }
        switch ($matches[1]) {
            case "FRUIT":
            case "VEGGIE":
                list($foo, $bar, $type, $color, $size, $qty, $weight) = $matches;
                $array[] = compact("type", "color", "size", "qty", "weight");
                break;
            case "BOX":
                list($foo, $bar, $color, $largefit, $medfit, $smallfit) = $matches;
                $array[] = compact("color", "largefit", "medfit", "smallfit");
                break;
            case "PERSON":
                list($foo, $bar, $name, $build, $strength) = $matches;
                $array[] = compact("name", "build", "strength");
                break;
        }
    }
}
print_r($array);

Команда compact() действует противоположно extract(); то есть он принимает свои аргументы и помещает переменные с этими именами в ассоциативный массив.

person miken32    schedule 10.03.2017
comment
Когда я пробую этот код в файле, который на самом деле хочу обработать (~ 40 МБ), я получаю сообщение об ошибке памяти. Есть ли способ обойти это? - person exchoki; 11.03.2017
comment
Вы можете использовать fopen(), fread() и fclose() для доступа к файлу. Вместо того, чтобы загружать весь файл сразу, вы просто читаете его построчно. Затем просто замените цикл foreach на цикл while (!feof($fp)). - person miken32; 11.03.2017