【发布时间】:2012-02-05 10:25:11
【问题描述】:
我想知道如果文件中的第一行匹配指定的模式,是否有一种有效的方法来删除它。例如,我有一个包含以下形式数据的文件:
Date,Open,High,Low,Close,Volume,Adj.Volume
2012-01-27,42.38,42.95,42.27,42.68,2428000,42.68
2012-01-26,44.27,44.85,42.48,42.66,5785700,42.66
.
.
.
我想删除第一行,前提是它包含文本(如第一行的示例所示),如果它只包含数字(如其余行),则保持不变。这个任务非常简单,我通过应用以下代码和平来完成它,只要它不包含Date 模式,它将每一行写入$newFile:
while( <$origFile> )
{
chomp($_);
print $newFile $_ unless ($_ =~ m/Date/g)
}
正如我所提到的,这使工作完成。然而,当已知文本只能出现在第一行时,读取整个文件中的每一行似乎是一种极大的资源浪费..
有什么方法可以更有效地完成这项任务吗?
注意:我已经找到了一个几乎类似的问题 here,但由于我希望我的代码也可以在 Linux 和 Windows 上使用,所以在这里使用 sed 对我没有帮助。
提前致谢!
【问题讨论】:
-
无论在文件中的位置如何,您的代码都会删除这行文本。至于效率低下:您必须读取文件中的所有行,您不能从文件的开头删除字节(这就是文件系统的工作方式)。注意:您将在Perl: How do I remove the first line of a file without reading and copying whole file 中找到答案——只需与您的正则表达式结合即可。
-
(1) 您不想在不添加换行符的情况下大吃一惊,因为这会将您的整个输入文件放在一行上! (2) 你不需要指定 "$_ =~" 因为 m// 默认对 $_ 起作用。 (3) 您不需要 m// 上的 'g' 标志;它在这里什么也没做。
标签: algorithm perl pattern-matching