2014-11-06 2 views
-1

방금 ​​tcl을 배우기 시작했고 큰 파일을 읽는 데 문제가 있습니다. 내가 데이터는 다음과 같은 파일이이 같은tcl을 사용하여 파일의 모든 섹션을 읽는 방법?

420 
360 360 360 3434.01913 
P 6.9022 0.781399 -0.86106 
C 4.36397 -0.627479 3.83363 
P 6.90481 5.42772 3.08491 
.... 

및 종료 :

P -7.21325 1.71285 -0.127325 
C -4.14243 0.41123 4.67585 
420 
.69667 

그래서 C는 한 섹션의 마지막 줄이 420 다음 섹션의 시작입니다. 그래서 420 줄마다 전체 파일의 한 부분을 만듭니다. 어떻게하면이 파일의 모든 섹션을 읽고 "frame1"이라고 말하고 파일 끝까지 (frame2, frame3 ... 등) 할 수 있습니까? 나는 줄 단위로 전체 파일을 읽는 간단한 스크립트를 생각해 냈지만이 작업을 수행하는 방법을 모르겠다. 감사합니다.

+1

이 우리에게 문제를 해결하기 위해 당신의 시도를 표시합니다. –

+0

괜찮 았어 .proc read_xyz_frame {fp n_bp} { {0 {$ { 0을 얻는 동안 나는 을 설정한다. } { \t 세트 필드는 [분할 $ 라인 "을"] lassign $ 필드는 내가 사용하는 XYZ 을 $ FP 라인을 가져옵니다 이름을 지금 내 문제를 내가 주로 수행하고 싶어 line1.what n_atoms $를 설정하는 그것을 통과하지만, 각 섹션의 시작 부분에 두 개의 헤더 행이 있습니다. 나는 그들을 건너 뛰고 싶습니다. (필자가 올바른 용어를 모르는 경우 미안하지만) 파일의 다른 프레임이나 섹션을 읽기 시작합니다. – amir

답변

0

"tcl을 사용하여 파일의 모든 섹션을 읽는 방법? " 아주 간단하게 "당신이 선을 다 쓸 때까지 독서 유지"입니다. 당신의 while 루프

while { ...condition... } { 
    if {[gets $fp line] < 0} break 

    lassign $line name x y z 
    if {$name eq "420"} { 
     incr section_counter 
    } elseif {$name in {P C}} { 
     # do something with the data 
    } 
} 

조건 읽고 각 행에 대해 한 번 테스트됩니다

질문에 대한 대답은 "섹션을 계산하고 헤더 행을 생략하는 방법"이 같은 것입니다. 첫 번째 if 명령은 전체 파일을 읽은 후 루프에서 빠져 나옵니다. 행 중 하나에 적절한 목록이 아닌 문자열이 포함될 것으로 예상 할 때까지는 읽은 행을 분할 할 필요가 없습니다. 일단 변수에 줄의 필드를 할당하면 name을 보면 어떤 줄이 있는지 알 수 있습니다. 두 번째 if 명령은 $name이 "420"문자열 인 경우 섹션 카운터가 증가합니다. 반면에 $name에 "P"또는 "C"가 포함되어 있으면 처리 할 데이터 라인이 있습니다. 이러한 조건이 모두 충족되지 않으면 "420"행 다음에 행이 생기며 무시됩니다.

문서 : break는, gets는, ifincr, lassign, while

관련 문제