2013-06-25 3 views
1

저는 파이썬으로 정말 새롭고이 사이트를 검색하고 읽는 많은 문제를 이미 해결했습니다.txt 파일의 여러 줄에서 특정 번호를 읽고이를 txt에있는 각 줄 블록 끝에 추가하십시오.

SETUP 

    STN_NO 419430403 
    STN_ID "S1" 
    INST_HT 1.545000; 
END SETUP 
SLOPE (TgtNo, TgtID, CfgNo, Hz, Vz, SDist, RefHt, Date, Ppm, ApplType, Flags) 
    419430405, "S2", 1, 0.000000, 98.799682, 12.056200, 1.700000, 18-10-2012/10:06:08.0, 0.000000, 107, 00000000; 
    419430407, "1", 1, 0.000052, 98.799806, 12.056800, 1.700000, 18-10-2012/10:06:16.0, 0.000000, 107, 00000000; 
    419430409, "2", 2, 78.734236, 99.822405, 17.919000, 0.000000, 18-10-2012/10:09:50.0, 0.000000, 107, 00000000; 
    419430410, "3", 2, 78.861726, 108.352791, 17.213700, 0.000000, 18-10-2012/10:10:10.0, 0.000000, 107, 00000000; 
END SLOPE 

SETUP 
    STN_NO 419430459 
    STN_ID "1" 
    INST_HT 1.335000; 
END SETUP 
SLOPE (TgtNo, TgtID, CfgNo, Hz, Vz, SDist, RefHt, Date, Ppm, ApplType, Flags) 
    419430462, "S1", 5, 122.545107, 99.563594, 12.056300, 1.700000, 18-10-2012/11:04:36.0, 0.000000, 107, 00000000; 
    419430464, "50", 5, 200.000125, 99.563463, 12.058800, 1.700000, 18-10-2012/11:04:44.0, 0.000000, 107, 00000000; 
    419430466, "51", 6, 60.723043, 95.842462, 8.607300, 0.000000, 18-10-2012/11:06:36.0, 0.000000, 107, 00000000; 
    419430467, "52", 6, 99.683958, 95.664912, 7.581100, 0.000000, 18-10-2012/11:08:15.0, 0.000000, 107, 00000000; 
    419430468, "53", 6, 101.389131, 87.173327, 7.853000, 0.000000, 18-10-2012/11:08:51.0, 0.000000, 107, 00000000; 
END SLOPE 
END THEODOLITE 

문제는 내가 추가 할 것입니다 :하지만 지금은 시간이


내가 아래 구조의 txt 파일을 가지고 ... 내가 부탁 할 왔었다 각 라인의 끝에 적절한 INST_HT 값 (SLOPE과 END SLOPE 사이의 첫 번째 데이터 블록에서 1.545000을 의미하고 두 번째 슬롯에서는 1.335000을 의미).

목표는 TgtID, Hz, Vz, SDist, RefHt 열 (이미 완료 됨) 및 INST_HT (그 중 하나가 빠진 것)의 숫자 데이터가 포함 된 적절한 CSV 파일을 만드는 것입니다.

지금까지 생각한 것은 파일의 끝에서 시작하여 모든 INST_HT 값을 가진 목록을 만드는 것이라고 생각합니다.

아이디어가 있으십니까?

+0

기존 코드를 표시 할 수 있습니까? – dawg

답변

0

이것은 당신이 설명하는 문제에 대해 작동합니다 :

INST_HT = [1.545000, 
      1.335000] 
lines = open('tmp.txt') 
out = open('tmp2.txt', 'w') 
i = -1 
while True: 
    try: 
     line = lines.next() 
    except StopIteration: 
     break 
    if 'slope' in line.lower(): 
     i += 1 
     out.write(line) 
     while True: 
      line = lines.next() 
      if 'end slope' in line.lower(): 
       out.write(line) 
       break 
      else: 
       out.write(' ' + line.strip()[:-1] + ', ' + str(INST_HT[i]) + ';\n') 
    else: 
     out.write(line) 
out.close() 
+1

파일에있는 값을 사용하는 대신 INST_HT 값을 하드 코딩하는 이유는 무엇입니까? – abarnert

+0

대단히 감사합니다 !! 나는 둘 다 답변을 테스트하고 모든 것이 완벽하게 작동합니다! –

0

이 문제에 대해 이런 식으로 생각 : 당신은 라인별로 가고 싶어하고, 각 라인에 다른 일을.

last_inst_ht = None 
in_slope = False 
with open('infile.txt') as infile, open('outfile.txt') as outfile: 
    for line in infile: 
     if line.startswith('SLOPE'): 
      bits = line.split(')') 
      line = bits[0] + ', INST_HT' + bits[1] 
      in_slope = True 
     elif line.startswith('END SLOPE'): 
      in_slope = False 
     elif in_slope: 
      bits = line.split(';') 
      line = bits[0] + ', ' + last_inst_ht + bits[1] 
     elif line.strip().startwith('INST_HT'): 
      last_inst_ht = line.strip().split()[-1][:-1] 
     outfile.write(line) 

더 많은 상태 정보를 추적하여 좀 더 견고하게 만들 수 있습니다. SETUP 외부에 INST_HT이 표시되면 경고 또는 오류를 인쇄해야합니다. 또는 SLOPE 앞에 두 개의 SETUP 블록이 있거나 없으면 아무 것도 표시되지 않습니다. 또는 INST_HT없이 SETUP이 표시되는 경우 등등.

또한 필자가 회선을 구문 분석하는 방식은 정확하지 않습니다. 예를 들어, 필드 중 하나에 ;을 사용할 수 있다면 그 대신에 해당 필드의 중간에 last_inst_ht을 넣을 수 있습니다. 하지만 나는 맹목적으로 그것을 복사하는 대신 논리를 이해할 수 있기를 바라면서 간단하고 간결하게 유지하고 싶었습니다. 그래서 당신은 미래에 그것을 확장하고 디버그 할 수 있습니다.

+0

대단히 감사합니다 !! 나는 둘 다 답변을 테스트하고 모든 것이 완벽하게 작동합니다! –

관련 문제