2015-01-31 2 views
0

저는 tcl에 대해 매우 익숙하며 프로젝트를 시작하기 전에 기본 예제를 통해 약간의 이해를 돕고 있습니다.tcl을 사용하여 파일의 특정 내용을 삭제하는 방법

누군가가 파일의 특정 내용을 삭제하는 가장 좋은 방법을 찾거나 조언 해 주시면 감사하겠습니다.

제 경우에는 LogData.dat 파일에 일부 데이터가 있습니다.이 파일을 삭제하려면 행 번호 3을 삭제하고 동시에 첫 번째 열 (#Name, # 인덱스 #, #mspace)을 삭제 한 다음 저장하십시오. 변경 후의 파일

열 수는 5 개를 초과 할 수 있지만 삭제가 필요한 #Name, # Index #, #mspace 및 삭제가 필요한 줄 3이있는 첫 번째 열입니다. 궁금

내가 또한 필요

더 나은 어떻게 든 삭제 첫 번째 (#mspace를 제거한다) 3 호선을 삭제 한 후 다음 정규 표현식으로 단어 # NAME, #INDEX과 일치하는 #INDEX

# NAME &입니다 이 파일은 매우 클 수 있으며 (100MB) 여러 파일이 있으므로 모든 파일이 수정 될 때까지 반복해야한다는 점을 명심하십시오. 따라서 큰 파일을 빨리 읽고 쓰려면 메모리 문제를 피할 필요가 있습니다.

일부 사용자가 도움을 주거나 쉬운 예를 들어 주시면 감사하겠습니다.

아래에 표시된 예 (컷 다운 버전).

#Name Length Width height Time 
#Index m - - s 
#mSpace 0 0 0 0 
       13.4112     0     0     0 
      13.411177     0  1.8827043e-007    0.001 
      13.411122     0  1.8827043e-007    0.002 
+0

tl; dr - 입력 및 원하는 출력을 모두 표시하십시오. –

답변

0

나는 한 파일에서 다른 파일로 읽고 쓸 제리의 제안을 슬쩍 것이다 :

set input [open LogData.dat r] 
set output [open newLogData.dat w] 

필드는 문자 구분 의도 한대로, 그래서 split 작동하지 않습니다 될 것 같지 않습니다. 모든 행이 필드 내에 공백이없는 올바른 목록이면 아무런 문제가 발생하지 않습니다.

첫 번째 필드에 세 번째 줄의 문자열이 항상 #mSpace이고 첫 번째 필드에 다른 줄이없는 경우 줄을 계산할 필요가 없습니다. (업데이트 :. if 상태에서 고정 바보 오타 죄송)

# Loop through each line of the file 
while {[chan gets $input line] != -1} { 
    set data [lassign $line first] 
    if {$first ne "#mSpace"} { 
     chan puts $output $data 
    } 
} 

출력에,이 코드는 하나의 공백 문자로 필드 사이에 연속적인 공백 문자를 압축합니다.

chan close $input 
chan close $output 

이 코드는 사용자가 묻는 것처럼 보이기 때문에 모든 줄에서 첫 번째 필드를 제거합니다.질문을 다시 읽으면, 이제는 처음 세 줄에서만 꺼내기를 원했던 것 같습니다. 업데이트 코드 :

# Loop through each line of the file 
while {[chan gets $input line] != -1} { 
    set data [lassign $line first] 
    if {[string match #* $first]} { 
     if {$first ne "#mSpace"} { 
      chan puts $output $data 
     } 
    } else { 
     chan puts $output $line 
    } 
} 

문서 : chan, if, lassign, open, set, while

(참고 : 'Hoodiecrow'는 의견에 언급 된 날, 나는 그 닉 이전에 사용.)

+0

안녕하세요 Hoodiecrow, 답장을 보내 주셔서 감사합니다. 너와 제리는 나에게 파일을 편집하는 방법을 여러 가지 방법으로 가르쳐 주었다. yuo 대단히 감사합니다. – ArunM

2

파일을 읽고 다른 사람에게 편지를 보내 자신의 코드를 쉽게 따르도록 제안합니다. 당신은 조금 그런 식으로 그것을 할 수 :

# Open file for reading 
set input [open "LogData.dat" r] 
# Open file for writing 
set output [open "newLogData.dat" w] 

# This variable will help us know the line number 
set ln 0 

# Loop through each line of the file 
while {[gets $input line] != -1} { 
    incr ln 
    if {$ln < 4} { 
     if {$ln < 3} { 
      # On lines 1 to 2, split the line on tab, remove the first 
      # element of the result list and join it back with tabs 
      set line [join [lreplace [split $line \t] 0 0] \t] 
     } else { 
      # Skip line 3 completely 
      continue 
     } 
    } 
    puts $output $line 
} 

close $input 
close $output 

codepag demo

당신은 정말 위의 변수에 이미 파일 내용과 예입니다, 거기에 정규식 필요가 없습니다.

file delete LogData.datfile rename newLogData.dat LogData.dat과 같은 것을 넣어서 초기 파일을 제거하고 이전 파일의 이름으로 바꿀 수 있습니다.

+0

안녕하세요. Jerry, 답변 해 주셔서 감사합니다. 이것은 내가하고 싶었던 것입니다. 그리고 더 많은 것은 저에게 다음에해야할 일에 대해 좋은 아이디어를줍니다. 감사합니다. 이것은 매우 도움이되었습니다. – ArunM

관련 문제