2017-08-07 19 views
-2

我正在執行大型(8000行)庫數據轉換。我在一個文件中讀取並且想要逐行修改它。在到達文件結尾之前停止讀取文件。我的腳本在讀取文件時未命中行

open(my $infh, "<", 'infile.pica') 
     || die('Could not open pica file'); 
open(my $outfh, ">", 'infile.pica.norm') 
     || die('Could not open pica file'); 

my $counter = 0; 

while (my $line = <$infh>) { 

    $counter++; 
    # for debugging - this is the last line being read. 
    # infile actually has 7857 lines 

    if ($counter >= 7691) { 
     say $line; 
    } 
    # modification commented out for debugging 
    print $outfh $line; 
} 
close $infh; 
close $outfh; 

我首先想到的是,有在這一行一個奇怪的字符,但沒有什麼

006X $cEBC$03564211 (original) 
006X $cEBC$035642 (being read, thats what the say prints) 

這是該數據集的片段,其中停止閱讀:

[email protected] $0Oax 
002C $aText$btxt 
002D $aComputermedien$bc 
002E $aOnline-Ressource$bcr 
004A $09780309160193 
006X $cEBC$03564211 
[email protected] $aeng 
[email protected] $a2010 

您可以看到每行後面都有一個換行符 (嗨代碼0A)。 006X行是停止閱讀的地方。

+0

你的代碼看起來不錯,可能會發布一些你的設置的更多細節? –

+0

你看過線上的最後一個字符嗎?默認情況下,Perl會在換行符('\ n')上拆分行 - 所有行都有一行嗎? – reinierpost

+0

你可以用記事本++這樣的東西打開文件,讓它顯示所有的字符(如CR,LF等),然後看看嫌疑人的行,可能確實有些東西你不能「看」 – Nullman

回答

-2

下面是解決方案:問題與我發佈的腳本或甚至從文件讀取無關。在劇本我沒有張貼,我幾乎忘了通過調用函數來刷新輸出:

PICA::Writer->end() 

PICA::Writer->end

寫完。根據格式和輸出處理程序,編寫頁腳(例如XML結束標記),並關閉輸出處理程序。之後狀態設置爲PICA::Writer::ENDED。如果作者之前沒有啓動過,則首先調用啓動方法。

結束或寫入已經結束的作家將引發錯誤。您可以使用輸出方法或start方法重新啓動已結束的作者。