【问题标题】:PHP: Loop through text file and isolate lines which a specific "starting point"PHP:遍历文本文件并隔离特定“起点”的行
【发布时间】:2011-01-14 16:49:08
【问题描述】:

我正在尝试减少一些文本文件中的一些编辑时间,其中大约有 10.000 行文本,但我只需要大约 200 行或更多。

文本文件依赖于几乎特定的模式,但它有时会有所偏差,但我的“重点”是为了选择要保留的正确行,该行始终以:z3455然后有一个变量,例如:z3455 http://url.com/data1/data1.1/data1.3/ (342kb)

我有一个算法来捕获 URL 及其内容,但现在我需要某种方法来遍历文本文件,删除所有行 exceptz3455 开头然后将它们“推”在一起,使它们列在彼此的下方。

我在 PHP 中为此尝试了不同的方法,但似乎找不到正确的函数。我可以“隔离”一个特定的行号,但是当它偏离时,我不能完全使用这种方法。

我希望有人可以帮助我,或者提供代码,或者告诉我如何解决这个问题。

提前致谢

真诚
- 梅斯蒂卡

【问题讨论】:

  • 你可以展示一些你尝试过的东西吗?即使它是伪代码,如果我们不会在不知不觉中复制您的工作会更好。
  • 对于一个体面的文本编辑器程序来说,让您使用正则表达式在文件中搜索/替换是很常见的。您甚至可以对目录中的所有文件执行此操作,并逐步进行操作,这样您就可以放心操作了。

标签: php text for-loop loops


【解决方案1】:
$in = fopen('file.txt', 'rb')
$out = fopen('filtered.txt', 'wb+')
while($line = fread($in)) {
    if (preg_match('/^z3455 http.*$/', $line)) {
         fwrite($out, $line);
    }
}

当然,如果你是从命令行运行它,你还不如跳过 PHP 并使用 grep,这样效率会高得多:

$ grep '^z3455 http' file.txt > filtered.txt

【讨论】:

  • 嗨,马克,非常感谢您的帮助。我拿了你的代码并对其进行了一些修改,然后它就像一个魅力。我没有考虑使用正则表达式(出于某种原因),但这样做很有意义。
【解决方案2】:

这应该可以解决问题。 substr 在这里应该比正则表达式更快,尤其是在大文件上。

foreach (file($file) as $line) {
    if (substr($line, 0, 5) != 'z3455') {
        continue;
    }
    // $line is now a line of text that starts with 'z3455.
    // Do with it whatever you need. If you want whatever comes
    // after z3455, you could then do $line = substr($line, 5);
}

【讨论】:

    【解决方案3】:

    只是我脑海中的第一个想法(非常基本且未经测试):

    <?php
    $filename = 'foo.txt';
    $file = file($filename);
    $matchedLines = array();
    
    foreach($file as $line) {
      if(preg_match('/^z3455/', $line)) {
        $matchesLines[] = $line;
      }
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多