【问题标题】:PHP to delete lines within text file beginning with 0 or a negative numberPHP删除文本文件中以0或负数开头的行
【发布时间】:2011-02-07 20:11:58
【问题描述】:

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

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

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

文本文件遵循以下结构:

-29 aullah1
0 name
4 username
4 user
6 player

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

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

谢谢。

【问题讨论】:

    标签: php file file-io


    【解决方案1】:

    例子:

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

    【讨论】:

      【解决方案2】:

      我猜这几行是未经测试的。

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

      【讨论】:

      • 您好 Sabeen Malik,感谢您的回复和努力。我真的很感激它。当我使用代码时,我相信它在第 2 行说,空变量。当然,我很确定这是我的错误。再次,非常感谢您的时间和努力,他们非常感谢。 ;)
      • 我很高兴我能派上用场。 $content变量需要携带你文件中的数据,最后的$newContent变量会携带新剥离的文件,可以写入新文件。
      【解决方案3】:

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

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

      注意:不包括错误检查。

      【讨论】:

      • 嗨 codaddict,感谢您的回复和努力,我真的很感激。您的编码看起来很棒且非常有效,但是当我尝试使用您的代码时,它清空了整个文本文件,将其留空。我不太确定问题可能出在哪里,当然我很确定这可能是我做的不对。 :( 再次感谢您的回复,我非常感谢您的努力、回复和时间。;)
      • 确保您没有以写入模式打开输入文件。如果你这样做,它会抹去它的内容!
      • 我的程序读取输入文件并创建一个新的输出文件,删除不需要的行。因此,请确保输入和输出的文件名不同。
      【解决方案4】:
      file_put_contents($newfile, 
          implode(
              preg_grep('~^[1-9]~', 
                  file($oldfile))));
      

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 您好 oneat,非常感谢您的回复。我已经尝试过您的编码,它看起来非常有效,但是当我使用它时它会显示错误。我相信它在第 2 行说,空变量。当然,我很确定这是我的错误。再次,非常感谢您的时间和努力,他们非常感谢。 ;)
        【解决方案6】:

        这是另一种方式:

        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 等合理的存储方法等。当然,还有错误检查。

        【讨论】:

          猜你喜欢
          • 2020-10-31
          • 2011-08-30
          • 2010-09-17
          • 2014-08-13
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          相关资源
          最近更新 更多