Сохранить строку, только если она не соответствует

#php

#php

Вопрос:

Я пытаюсь сохранить данные из файла на случай, если строка не соответствует символу. В моем случае у меня есть список чисел, я хочу сохранить эти числа, если только первый символ не равен «0» -нулю-

Вот мой код:

 <?php
$cleanfile = "cleanfile.txt";
$handle = fopen("file.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        if ($line[0] != 0) {
            $save = file_put_contents($cleanfile, $line);
        }
    }

    fclose($handle);
} else {
    // error opening the file.
} 
 

Мой file.txt содержит следующие записи:

 1
2
3457
94
31
54
039
3114
94
01
33333
1
2
3457
94
31
54
039
3114
94
01
33333
1
2
3457
94
31
54
039
3114
94
01
33333
 

Комментарии:

1. Расскажите нам, где вы застряли.

2. На самом деле это не сохранение записей, которые не начинаются с 0, он сохраняет только «01» в cleanfile.txt

3. Так что это похоже на то, что если это условие не выполняется, если ($line[0] != 0)

4. Из документации : если имя файла не существует, файл создается. В противном случае существующий файл перезаписывается, если не установлен флаг FILE_APPEND.

Ответ №1:

Вам нужно передать FILE_APPEND флаг file_put_contents() , например:

 <?php
$cleanfile = "cleanfile.txt";
$handle = fopen("file.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        if ($line[0] != 0) {
            $save = file_put_contents($cleanfile, $line, FILE_APPEND);
        }
    }

    fclose($handle);
} else {
    // error opening the file.
}
 

Однако ваше решение немного требует ресурсов, поскольку каждый вызов file_put_contents() генерирует ненужные накладные расходы. Пожалуйста, рассмотрите эту демонстрацию как более легкое и компактное решение:

 <?php

// Collect all non-filtered lines.
$sieved = [];
// Read file.txt into an array, skipping empty lines.
foreach (file('file.txt', FILE_SKIP_EMPTY_LINES) as $line)
{
        if ($line[0] !== '0')
                $sieved[] = $line;
}

// Write out each array element, keeping the newlines from the input.
file_put_contents('cleanfile.txt', $sieved);
 

Комментарии:

1. Спасибо, я хотел проголосовать, но там сказано, что мне нужна репутация 15.. Я принял это вместо этого 🙂

Ответ №2:

Для развлечения, если файлы не огромны, это должно сработать. Считайте файл в массив, используйте grep для строк, не начинающихся с 0 , и запишите его в новый файл:

 file_put_contents("cleanfile.txt", preg_grep('/^[^0]/', file("file.txt")));
 

Вы можете заменить grep фильтром:

 array_filter(file("file.txt"), function($v) { return ($v[0] != 0); })