我有一个大约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)文本类型文件。
有什么想法吗?
感谢您的时间,帮助和知识。
答案 0 :(得分:4)
我建议使用file_get_contents()
并将变量中的文件内容保存为字符串,然后在每个换行符处使用explode()
字符串,然后在foreach
循环中使用preg_match()
使用$output
检查行是否以3个分号和一个空格开头,如果它有剂量,则将其放在另一个名为implode()
的数组中。在foreach之后,$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);
?>
将其打印在另一个文件中。希望这会有所帮助: - )
代码:
{{1}}
答案 1 :(得分:1)
取决于..我会尝试加载到一个字符串,然后用换行符进行一次爆炸(),所以它在数组中,然后运行一个foreach,跳过任何没有strpos == 0 -AND- strpos! == false,如果不匹配,你可以继续跳到下一行。
另一种选择是解析,跳过,甚至使用fseek等。取决于很多不同的因素,以确定最快的是什么。
您可以稍后进行内爆,然后重新添加换行符,然后推出文件,和/或使用换行符。取决于输出的位置。
答案 2 :(得分:0)
我认为你自己给出了答案:
创建一个脚本,在循环中逐行读取输入文件(while)。如果满足两个条件,它会将每一行写入输出文件:1。标志(“done”)为FALSE,2。该行不以“;;;”(不是空白)开头。这将删除以三个分号开头的行。一旦你得到一个包含更多分号的行,你将标志设置为TRUE,因此剩余的行将被复制而不进行检查。