2013-05-21 17 views
1

当文件的每一行代表一天数据时,我将每日股票价格保存在文本文件中的文件。例如:在向文件中添加新行时删除空行(在Perl中)

20/05/2013 23.46 23.58 23.43 23.57 32884800 23.57 
17/05/2013 23.27 23.48 23.2 23.46 41037700 23.46 

我已经创建,检查在所保存的文件的最后日期(最后日期出现在在文件的顶部),将它与当前的日期和如果不相等更新的更新器通过仅添加缺失的行来删除数据(新行添加在现有文件的顶部)。

我已经使用this方法来行附加:

open my $in, '<', $file  or die "Can't read old file: $!"; 
open my $out, '>', "$file.new" or die "Can't write new file: $!"; 

print $out "# Add this line to the top\n"; 

while(<$in>) 
    { 
    print $out $_; 
    } 

close $out; 

而且一般能正常工作,只有一个问题。在最早的行和第一个新添加的行之间添加一条空行。例如,如果我最后一次保存的日期是

15/05/2013 23.04 23.25 22.91 23.24 40153000 23.24 

,然后新行被添加:

16/05/2013 23.1 23.35 23.1 23.27 33023300 23.27 

它看起来像:

15/05/2013 23.04 23.25 22.91 23.24 40153000 23.24 

16/05/2013 23.1 23.35 23.1 23.27 33023300 23.27 

我希望它看起来像那个:

15/05/2013 23.04 23.25 22.91 23.24 40153000 23.24 
16/05/2013 23.1 23.35 23.1 23.27 33023300 23.27 

我想到ge在添加行时删除\n,但是它只会产生一个长字符串。我想我应该以某种方式删除\n,但只是最后一行。我怎么做?

编辑:行结束似乎只是LF而不是CRLF。这很重要吗?因为目前看起来该行不像这样或这样的空行模式:/^\s*$/或这个:/^$/

回答

1

您可以使用chomp智能地进食换行符(如果未翻译的CRLF),然后实际输出一个换行符。在之间,如果线路为空,则可以跳过:

while(<$in>) 
{ 
    chomp; chomp;  # Eat up to two newlines, just in case 
    next if /^\s*$/;  # Line is empty or contains whitespace 
    print $out "$_\n"; 
} 
+0

谢谢您的回答,但是在更改我的代码后,如您所建议的 - 不会更改文件外观。它仍然显示出一条空白线。顺便说一句,我相信要检查一个空文件,这个正则表达式应该使用'/^\ s * $ /',而不是'\ s *'。但即使在这种变化之后,这条线仍然存在。 –

+0

我刚刚注意到空行只有LF,而不是CRLF。在使用这样的正则表达式时这很重要:'/^$ /'?谢谢! –

+0

这很好。所做的只是将整个字符串与可选的空白字符相匹配。这些chomps后面的字符串中不应该有CR或LF字符,这就是我们明确写出一个字符的原因。也许偏执狂,但如果偶尔处理Windows风格的文本文件,这不是一个坏习惯。 – paddy