4

我有一个大约 25,000 行的文本文件。大约 525kb。

有些行的开头有随机文本。有些有很长的分号字符串。

其他一些只有三个分号,然后在同一行上有一个空格和可选的更多文本。这些是我要删除的行。

这是一个示例....

   ;;; Updated Time 20120706122706
   ;;; Generic DEveloper Output

   ;;; Some Random Comments
   ;;; I got some more...
   ;;; Yet another uneeded line
   ;;; Thanks for using StackOverflow <http://stackoverflow.com>, or...
   ;;; Not.

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Banana Production

   [Data_Release_Version]
   Version=12586
   Released=20120706122706

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baseline Properties

   [BaseLineProperties]
   Comment=BaselineProperties

- - - 等等。

一旦到达 4 或更多的第一行;在线上,我需要文件的其余部分,因为没有“;;;”行。

试图快速找到一些东西,而不是读取所有行并在它不匹配时将其写回 ";;; "。

文件是 ASCII(可能是 UTF-8)文本类型文件。

有任何想法吗?

感谢您的时间、帮助和知识。

4

3 回答 3

4

我建议使用file_get_contents()并将文件的内容作为字符串保存在一个变量中,然后explode()在每个换行符处使用该字符串,然后在foreach循环中,用于preg_match()检查该行是否以 3 个分号和一个空格开头,如果它没有,把它放在另一个名为$output. 在 foreach 之后,implode() $output添加一个换行符并用于file_put_contents()在另一个文件中打印它。希望这可以帮助 :-)

代码:

<?php
$string = file_get_contents($filename);
$array = explode("\n",$string);
foreach($array as $arr) {
    if(!(preg_match("^;;;\s",$arr))) {
        $output[] = $arr;
    }
}

$out = implode("\n",$output);
file_put_contents($path,$out);
?>
于 2012-07-29T07:22:02.353 回答
1

取决于..我会尝试加载到一个字符串中,然后用换行符做一个explode(),所以它在数组中,然后在没有strpos == 0 -AND- strpos !== false 的任何地方运行一个带有跳过的foreach ,如果不匹配,您可以输入继续跳到下一行。

另一种选择是解析和跳过,甚至使用 fseek 等。取决于很多不同的因素来确定什么是最快的。

您可以稍后内爆,并重新添加换行符,然后推出文件,和/或使用换行符。取决于输出应该去哪里。

于 2012-07-29T06:53:14.730 回答
0

我想你自己给出了答案:

制作一个在循环(while)中逐行读取输入文件的脚本。如果满足两个条件,它将每一行写入输出文件:1. 标志(“done”)为 FALSE 和 2. 该行不以“;;;”(不是空白)开头。这将删除那些以三个分号开头的行。一旦出现包含更多分号的行,您将标志设置为 TRUE,因此剩余的行将被复制而不被检查。

于 2012-07-29T06:52:08.420 回答