2012-02-15 49 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

相关问题