2012-02-15 2 views
0

파일을 한 줄씩 읽고 구문 분석하려고하지만 이상한 동작을 일으키는 파일 끝에 구분 기호가 있습니다. 그것은 간단 읽을오류가있는 탭 구분 파일의 불량 문자

20111129  AMEX BHO  OTCBB BHODD 
20111129  AMEX LCAPA NASDAQ LMCA 

코드 : 여기

파일의 라인은 내가 좋아하는 외모를 읽고있는 무슨이다

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

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"; 

출력은 다음과 같이 나타납니다

그래서 각 줄 끝 부분에는 '인쇄'가 시작되는 문자가 있습니다. 라인의 시작 부분에, 거기에 인쇄해야하는 4를 닦아냅니다. 이는 인쇄가 줄의 시작 부분으로 되돌아 가야하는 위치를 재설정하는 문자와 같습니다. 이 가짜 캐릭터를 '쫓아내는'방법이 있습니까? 또는 아마도 내 코드에 어떤 종류의 버그가 있지만 비슷한 스크립트를 가지고있는 다른 스크립트가 있습니다 ...

감사합니다 사전에!

답변

4

파일에는 Windows 줄 끝이 있습니다. 파일을 열 때 :crlf 레이어를 지정할 수

s/\r//; 

을 또는 : 불량 문자 "\ 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