【问题标题】:Getting rid of an empty line when adding new lines to a file (in Perl)向文件中添加新行时摆脱空行(在 Perl 中)
【发布时间】:2013-05-15 16:37:45
【问题描述】:

当文件的每一行代表一天的数据时,我有将每日股票价格保存在文本文件中的文件。例如:

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

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

编辑:行尾似乎只是LF,而不是CRLF。这有关系吗?因为目前似乎该行与这样或这样的空行模式不匹配:/^\s*$/ 或这样:/^$/

【问题讨论】:

    标签: perl fileupdate


    【解决方案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";
    }
    

    【讨论】:

    • 感谢您的回答,但是按照您的建议更改了我的代码后 - 没有更改文件外观。它仍然显示一个空行。顺便说一句,我相信要检查一个空文件,这个正则表达式应该使用/^\s*$/,而不是\s*。但即使在此更改之后,这条线仍然存在。
    • 我刚刚注意到空行只有LF,不是CRLF。使用这样的正则表达式时这有关系吗:/^$/?谢谢!
    • 没关系。所做的只是匹配整个字符串,并带有可选的空格。在这些 chomps 之后的字符串中不应该有 CR 或 LF 字符,这就是我们明确写出一个的原因。也许是偏执狂,但如果您偶尔处理 Windows 样式的文本文件,这不是一个坏习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多