PHP删除文本文件中以0或负数开头的行

时间:2010-09-04 12:17:15

标签: php file file-io

感谢您抽出宝贵时间阅读本文,我将感谢每一个回复,无论内容的质量如何。 :)

使用php,我正在尝试创建一个脚本,根据行是以0还是负数开头,如果需要,将删除文本文件(.txt)中的多行。文件中的每一行总是以数字开头,我需要删除所有中性和/或负数。

我正在努力的主要部分是文本文件中的内容不是静态的(例如包含x个行/单词等)。事实上,它每隔5分钟自动更新几行。因此,我希望删除包含中性或负数的所有行。

文本文件遵循以下结构:

-29 aullah1
0 name
4 username
4 user
6 player

如果可能的话,我会删除第1行和第2行,因为它以中性/负数开头。在某些时候,有时可能有两个以上的中性/负数。

感谢所有的帮助,我期待着您的回复;谢谢。 :)如果我没有清楚地解释任何内容和/或您希望我更详细地解释,请回复。 :)

谢谢。

6 个答案:

答案 0 :(得分:6)

示例:

$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()新行字符不在行尾,这样你就不会得到空白空间。测试成功。

答案 1 :(得分:6)

我想这些线路上的东西,它是未经测试的。

$newContent = "";
$lines = explode("\n" , $content);
foreach($lines as $line){
  $fChar = substr($line , 0 , 1);
  if($fChar == "0" || $fChar == "-") continue;
  else $newContent .= $line."\n";
}

答案 2 :(得分:6)

如果文件很大,最好逐行读取:

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

注意:错误检查不包括在内。

答案 3 :(得分:6)

file_put_contents($newfile, 
    implode(
        preg_grep('~^[1-9]~', 
            file($oldfile))));

php不是特别优雅,但仍然......

答案 4 :(得分:5)

将整行加载到变量中,然后检查第一个字母是 - 还是0。

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

我改变了malik的代码以获得更好的性能和质量。

答案 5 :(得分:1)

这是另一种方式:

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等)。当然还有错误检查。