2013-05-18 75 views
0

我試圖創建一個簡單的腳本來讀取包含書名記錄的文本文件。每個記錄都用普通的舊雙空格分開(\r\n\r\n)。我需要計算文件中有多少記錄。在Perl中使用CR/LF(回車符和換行符)分隔計數記錄

例如這裏輸入文件:

record 1 
some text 


record 2 
some text 
... 

我使用正則表達式來檢查回車和新行,但不能匹配。我究竟做錯了什麼?我在我的智慧結束。

sub readInputFile { 

    my $inputFile = $_[0]; #read first argument from the commandline as fileName 

    open INPUTFILE, "+<", $inputFile or die $!; #Open File 

    my $singleLine; 
    my @singleRecord; 
    my $recordCounter = 0; 

    while (<INPUTFILE>) {     # loop through the input file line-by-line 
     $singleLine = $_; 
     push(@singleRecord, $singleLine); # start adding each line to a record array 

     if ($singleLine =~ m/\r\n/) {  # check for carriage return and new line 
      $recordCounter += 1; 
      createHashTable(@singleRecord); # send record make a hash table 
      @singleRecord =();    # empty the current record to start a new record 
     } 

    } 

    print "total records : $recordCounter \n"; 
    close(INPUTFILE); 
} 
+0

我剛剛纔知道白色空間匹配[\ t \ n \ f \ r]。超混淆。 這是我的修改後的代碼,其正確地計數我的記錄: 如果($ SINGLELINE =〜米/^\ S $ /){#檢查爲回車和換行 \t \t \t \t $ recordCounter ++; } – astra

+0

你的新正則表達式只匹配一個字符。如果它有效,那麼你知道爲什麼試圖匹配兩個字符失敗。 –

回答

1

這聽起來像你正在處理的Linux在這種情況下,要打開與:crlf層,將所有CRLF行結束轉換爲標準的Perl \n結尾的文件在Windows的文本文件。

如果您正在Windows平臺上閱讀Windows文件,那麼已經爲您完成了轉換,並且在您讀取的數據中找不到CRLF序列。如果您正在閱讀Linux文件,那麼無論如何都沒有CR字符。

這聽起來像是你的記錄被一個空行隔開。將內置的輸入記錄分隔符變量$/設置爲空字符串將導致Perl一次讀取整條記錄。

我相信這個版本的子程序是你需要的。請注意,熟悉Perl的人會感謝您爲變量和子程序名使用小寫字母和下劃線。通常爲包名保留混合大小寫。

你不顯示create_hash_table,所以我不能告訴它需要什麼數據。我已經整理並將記錄拆分成行,並在刪除換行符的同時傳遞了記錄中的行列表。將整個記錄作爲單個字符串傳遞可能會更好,並根據需要讓create_hash_table進行處理。

sub read_input_file { 

    my ($input_file) = @_; 

    open my $fh, '<:crlf', $input_file or die $!; 
    local $/ = ''; 

    my $record_counter = 0; 

    while (my $record = <$fh>) { 
     chomp; 
     ++$record_counter; 
     create_hash_table(split /\n/, $record); 
    } 
    close $fh; 

    print "Total records : $record_counter\n"; 
} 
0

你可以通過改變Perl的記錄分離器,這將使循環一次一次返回的記錄而不是行的更簡潔地做到這一點。

E.g.打開文件後:與local

local $/ = "\r\n\r\n"; 
my $recordCounter = 0; 
$recordCounter++ while(<INPUTFILE>);  

$/持有Perl的全球記錄分隔符,範圍界定它可以讓你暫時忽略它的值,直到封閉塊結束時它會自動恢復到以前的值。

但它聽起來像你正在處理的文件可能實際上有「\ n \ n」記錄分隔符,甚至「\ r \ r」。您需要正確設置記錄分隔符,以便處理任何文件。

相關問題