2012-02-15 20 views
0

ファイルを1行ずつ読み込んで解析しようとしていますが、ファイルの最後に奇妙な動作を引き起こす種類の区切り文字があります。タブ区切りファイルの不正な文字でエラーが発生する

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を拭き取ってください。これは、行の先頭まで印刷が発生しているはずの場所をリセットする文字のようなものです。この不正なキャラクターを「追い出す」方法はありますか?あるいは私のコードに何らかのバグがあるかもしれませんが、私は他のスクリプトと同様のことをしています...

ありがとうございました!

ドン

答えて

4

このファイルにはWindowsの行末があります。

s/\r//; 

または、ファイルを開くときに:crlf層を指定することができます:不正な文字は「\ rを」で、あなたは正規表現でそれを削除することができます。

+0

cool thanks man!私はこれを行うことでそれを修正しました:cat Changes.AMEX.0202.txt | sed 's/\ r //'> out –

+0

追加のプロセスをスキップします。 sedは引数として指定されたファイル名から入力を受け取ります:sed '...' Changes.AMEX.0202.txt> out – JRFerguson

+0

@JRFerguson:もっとも低コストのソリューションは、Perl自体で置換を行うことです。 – choroba

関連する問題