2013-05-21 40 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