PHP для удаления строк в текстовом файле, начинающихся с 0 или отрицательного числа - PullRequest
2 голосов
/ 04 сентября 2010

Спасибо, что нашли время, чтобы прочитать это, и я буду благодарен за каждый отдельный ответ, независимо от качества контента. :)

Используя php, я пытаюсь создать скрипт, который при необходимости удалит несколько строк в текстовом файле (.txt), основываясь на том, начинается ли строка с 0 или отрицательного числа. Каждая строка в файле всегда начинается с цифры, и мне нужно стереть все нейтральные и / или отрицательные числа.

Основная часть, с которой я борюсь, заключается в том, что содержимое текстового файла не является статичным (например, содержит x количество строк / слов и т. Д.) Infact, оно автоматически обновляется каждые 5 минут несколькими строками. Поэтому я хотел бы удалить все строки, содержащие нейтральное или отрицательное число.

Текстовый файл имеет следующую структуру:

-29 aullah1
0 name
4 username
4 user
6 player

Если возможно, я бы хотел удалить строки 1 и 2, так как они начинаются с нейтрального / отрицательного числа. В точках, может быть, бывает более двух нейтральных / отрицательных чисел.

Вся помощь приветствуется, и я с нетерпением жду ваших ответов; благодарю вас. :) Если я ничего не объяснил четко и / или вы хотите, чтобы я объяснил более подробно, пожалуйста, ответьте. :)

Спасибо.

Ответы [ 6 ]

6 голосов
/ 04 сентября 2010
file_put_contents($newfile, 
    implode(
        preg_grep('~^[1-9]~', 
            file($oldfile))));

php не особенно элегантно, но все же ...

6 голосов
/ 04 сентября 2010

Если файл большой, лучше читать его построчно как:

$fh_r = fopen("input.txt", "r");  // open file to read.
$fh_w = fopen("output.txt", "w"); // open file to write.

while (!feof($fh_r)) { // loop till lines are left in the input file.
        $buffer = fgets($fh_r); //  read input file line by line.

        // if line begins with num other than 0 or -ve num write it. 
        if(!preg_match('/^(0|-\d+)\b/',$buffer)) { 
                fwrite($fh_w,$buffer);
        }       
}       

fclose($fh_r);
fclose($fh_w);

Примечание: ошибка проверки не включена.

6 голосов
/ 04 сентября 2010

Что-то в этих строках, я думаю, не проверено.

$newContent = "";
$lines = explode("\n" , $content);
foreach($lines as $line){
  $fChar = substr($line , 0 , 1);
  if($fChar == "0" || $fChar == "-") continue;
  else $newContent .= $line."\n";
}
6 голосов
/ 04 сентября 2010

Пример:

$file = file("mytextfile.txt");
$newLines = array();
foreach ($file as $line)
    if (preg_match("/^(-\d+|0)/", $line) === 0)
        $newLines[] = chop($line);
$newFile = implode("\n", $newLines);
file_put_contents("mytextfile.txt", $newFile);

Важно, чтобы вы chop() начинали символ с конца строки, чтобы не было пустого места. Успешно протестировано.

5 голосов
/ 04 сентября 2010

Загрузить всю строку в переменную, обрезать ее и затем проверить, является ли первая буква - или 0.

$newContent = "";
$lines = explode("\n" , $content);
foreach($lines as $line){
  $fChar = $line[0];
  if(!($fChar == '0' || $fChar == '-'))
  $newContent .= $line."\n";
}

Я изменил код Малика для повышения производительности и качества.

1 голос
/ 04 сентября 2010

Вот еще один способ:

class FileCleaner extends FilterIterator
{
    public function __construct($srcFile)
    {
        parent::__construct(new ArrayIterator(file($srcFile)));
    }

    public function accept()
    {
        list($num) = explode(' ', parent::current(), 2);
        return ($num > 0);
    }

    public function write($file)
    {
        file_put_contents($file, implode('', iterator_to_array($this)));
    }
}

Использование:

$filtered = new FileCleaner($src_file);
$filtered->write($new_file);

Логика и методы могут быть добавлены в класс для других вещей, таких как сортировка, поиск наибольшего числа, преобразование в нормальный метод хранения, такой как csv и т. Д. И, конечно же, проверка ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...