2012-02-15 19 views
0

我正在嘗試逐行讀取和解析文件,但在導致奇怪行爲的文件末尾存在某種分隔符。製表符分隔文件中的流氓字符導致錯誤

以下是該文件的行我讀的樣子:

20111129  AMEX BHO  OTCBB BHODD 
20111129  AMEX LCAPA NASDAQ LMCA 

代碼閱讀起來很簡單:

my(@line) = <INFO>; 
foreach $line(@line) { 
    chomp($line); 
    my @vals = split('\t', $line); 

    my $date = $vals[0]; 
    my $old_exch = $vals[1]; 
    my $old_symb = $vals[2]; 
    my $new_exch = $vals[3]; 
    my $new_symb = $vals[4]; 

    print "0> date '$date'\n"; 
    print "1> old Exch '$old_exch'\n"; 
    print "2> old symb '$old_symb'\n"; 
    print "3> new Exch '$new_exch'\n"; 
    print "4> new symb '$new_symb'\n"; 

輸出顯示如下:

0> date '20111129' 
1> old Exch 'AMEX' 
2> old symb 'BHO' 
3> new Exch 'OTCBB' 
'> new symb 'BHODD 

所以在每行尾部似乎有一個字符導致尾隨'打印在行首之前,清除那些應該在那裏打印的4。它就像一個字符,重置打印應該發生回到行的開頭的位置。有沒有什麼辦法可以「榨取」這個流氓角色?或者可能在我的代碼中存在某種錯誤,但是我有其他腳本執行類似的操作...

非常感謝!

Don

回答

4

該文件具有Windows行結束符。流氓字符爲「\ r」,你可以用正則表達式中刪除:

s/\r//; 

或者,您可以打開文件時指定:crlf層。

+0

很酷謝謝你!我通過這樣做來修復它:cat Changes.AMEX.0202.txt | sed's/\ r //'> out – 2012-02-15 11:40:39

+0

跳過使用額外的過程。 sed從指定的文件名作爲其參數:sed'...'Changes.AMEX.0202.txt> out – JRFerguson 2012-02-15 13:02:38

+0

@JFFerguson:成本最低的解決方案是在Perl本身中進行替換。 – choroba 2012-02-15 15:40:05

相關問題