在向文件中添加新行时去掉空行(在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

我已经创建了一个更新程序,它检查保存文件中的最后日期(最后日期出现在文件的顶部),将其与当前日期进行比较,如果不相等,则只通过附加缺失的行来更新缺失的数据(新行添加在现有文件的顶部)。

我使用这种方法来附加行:

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 topn";
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

我想在添加行时去掉n,但它只会产生一个长字符串。我想我应该把n去掉,但只是为了最后一行。我怎么做呢?

EDIT:行尾似乎只是LF,而不是CRLF。这有关系吗?因为目前看起来行不匹配像这样的空行模式或这个:/^s*$/或这个:/^$/

您可以使用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";
}

相关内容

  • 没有找到相关文章

最新更新