2012-11-22 4 views
0

파일에서 구문 분석 할 필드 집합을 가지고 있으며 foreach 루프 내에서 한 줄씩 줄을 긋고 있습니다. 줄을 건너 뛰고 이동하는 방법을 알고 싶습니다. 다음 줄 예를 들어foreach 루프 안에 줄 바꿈을 삽입하고 데이터를 가져 오는 방법

에 "ABC"라는 문자열을 발생하면, 나는 다음 줄의 숫자,

 
some characters "ABC" 
123 

문제는 실제로 수 많은 데있다 잡아 필요 파일에 있지만 숫자를 잡을 필요가 있습니다. 특히 "ABC"문자열 다음에 줄 바꿈 이후에 오는 번호가 필요합니다.

어떻게해야합니까? ?

답변

2

을 시도 할 수 있습니다 그것은 당신이 찾을 때 다음 쉽게 추가 라인을 읽을 수 있기 때문에, 한 번에 하나 개의 라인을 읽는하는 while 루프와 함께 할 수있는 좀 더 쉽게입니다 당신의 트리거의 경우 (당신이 그들에 "ABC"과 라인의 실행이없는 가정) :이 foreach와 어색

set fd [open $theFilename] 
while {[gets $fd line] >= 0} { 
    if { 
     [string match *"ABC"* $line] 
     && [gets $fd line] >= 0 
     && [regexp {\d+} $line -> num] 
    } then { # I like to use 'then' after a multi-line conditional; it's optional 
     puts "Found number $num after \"ABC\"" 
    } 
} 
close $fd 

이유는이 같은 N을 처리 항상 것입니다 반복 할 때마다 매번 요소 수. 실행-의 라인 문제가있을 수 있습니다 당신이 데이터를 처리하는 경우

는 호기심 충분히 foreach와 떨어져 실제로 더 나은, 위의 언급 :

set fd [open $theFilename] 
set lines [split [read $fd] \n] 
close $fd 
foreach line $lines { 
    incr idx; # Always the index of the *next* line 
    if { 
     [string match *"ABC"* $line] 
     && [regexp {\d+} [lindex $lines $idx] -> num] 
    } then { 
     puts "Found number $num after \"ABC\"" 
    } 
} 

이는 당신이 할 때 lindex의 작동 무언가가 끝나면 빈 문자열 (간단한 정규식과 일치하지 않음)이 생성됩니다.

+0

철저한 답변 주셔서 감사합니다. – user1270123

2

이 간단한 해결책

set trigger 0 
set fh [open "your_file" "r"] 
while {[gets $fh line] != -1} { 
    if {[regexp -- {"ABC"} $line]} { 
     incr trigger 
    continue 
    } 
    if {$trigger > 0} { 
     puts $line ; # or do something else 
     incr trigger -1 
    } 
} 
close $fh 
관련 문제