2016-08-02 1 views
0

우리는 Python을 사용하여 PEST 분석으로 생성 된 까다로운 텍스트 파일을 구문 분석하는 방법을 찾기 위해 노력하고 있습니다. 30,000 건이 넘는 관측치에 대해 63 가지 변수의 측정치를 보여줍니다. 여기서, 출력의 예 63 개의 변수 이름Python 구문 분석 txt 파일, PEST 출력, jacobian.txt

      cmfa   cmfb   cmfc   cmfd   cmla   cmlb   cmlc   cmld 
          cmle   cgfa   cgfb   cgfc   cgfd   cgfe   dgfa   dgfb 
          dgfc   dgfd   icfa   icfb   icfc   icfd   vawa   vawb 
          vawc   vawd   vawe   vawf   vswa   vswb   vswc   vswd 
          vswe   chfa   chfb   chfc   chfd   chfe   cgwa   cgwb 
          cgwc   cgwd   cgwe   crta   crtb   crtc   crtd   crte 
          icha   ichb   ichc   ichd   iche   csea   cseb   csec 
          csed   csee   csef   caqa   caqb   crsa   crsb 

       0 -1.900000E-03 1.080000E-02 3.150000E-02 0.00000  0.00000  0.00000  0.00000  -3.020000E-02 
         0.00000  -1.870000E-02 0.00000  4.600000E-03 0.00000  0.00000  0.00000  4.510000E-02 
         0.00000  0.00000  3.650000E-02 -7.000000E-03 -2.100000E-03 -2.000000E-04 3.200000E-03 8.000000E-03 
        -7.000000E-04 -1.500000E-02 0.00000  4.800000E-03 1.900000E-03 4.000000E-04 2.500000E-03 2.500000E-03 
        -1.400000E-02 0.00000  0.00000  0.00000  0.00000  0.00000  -3.200000E-03 -8.060000E-02 
        -0.126500  0.298400  0.00000  0.00000  0.00000  0.00000  0.00000  8.000000E-04 
        -1.900000E-03 1.400000E-03 0.00000  0.00000  -3.200000E-03 0.00000  0.00000  0.00000  
         0.00000  0.00000  0.00000  0.00000  0.00000  -1.200000E-02 1.930000E-02 

       1 -1.800000E-03 1.140000E-02 1.850000E-02 0.00000  0.00000  0.00000  0.00000  -2.600000E-02 
         0.00000  -8.200000E-03 0.00000  1.200000E-03 0.00000  0.00000  0.00000  0.00000  
         0.00000  0.00000  2.560000E-02 -6.100000E-03 -1.100000E-03 0.00000  3.000000E-03 7.400000E-03 
        -7.000000E-04 -1.410000E-02 0.00000  5.000000E-03 1.900000E-03 3.000000E-04 2.300000E-03 2.300000E-03 
        -1.330000E-02 0.00000  0.00000  0.00000  0.00000  0.00000  -3.400000E-03 -8.410000E-02 
        -0.123500  0.301900  0.00000  0.00000  0.00000  0.00000  0.00000  1.200000E-03 
        -2.000000E-03 1.400000E-03 0.00000  0.00000  -3.200000E-03 0.00000  0.00000  0.00000  
         0.00000  0.00000  0.00000  0.00000  0.00000  -1.280000E-02 2.050000E-02 

       2 -3.300000E-03 6.500000E-03 4.040000E-02 0.00000  0.00000  0.00000  0.00000  -7.060000E-02 
        4.840000E-02 -0.112500  0.110300  0.00000  0.00000  0.00000  1.10330  0.00000  
         0.00000  0.00000  3.940000E-02 -8.500000E-03 -1.120000E-02 6.600000E-03 5.700000E-03 1.430000E-02 
        -1.300000E-03 -2.470000E-02 0.00000  3.700000E-03 2.200000E-03 5.000000E-04 4.300000E-03 4.500000E-03 
        -2.250000E-02 0.00000  0.00000  0.00000  0.00000  0.00000  -2.000000E-03 -5.840000E-02 
        -0.157300  0.292400  0.00000  0.00000  0.00000  0.00000  0.00000  -3.600000E-03 
        -1.700000E-03 1.200000E-03 0.00000  0.00000  -3.400000E-03 0.00000  0.00000  0.00000  
         0.00000  0.00000  0.00000  0.00000  0.00000  -7.400000E-03 1.180000E-02 

       3 -2.200000E-03 1.040000E-02 3.500000E-02 0.00000  0.00000  0.00000  0.00000  -4.390000E-02 
         0.00000  -3.170000E-02 2.590000E-02 0.00000  0.00000  0.00000  0.259400  0.00000  
         0.00000  0.00000  3.920000E-02 -1.030000E-02 -3.500000E-03 1.500000E-03 3.600000E-03 9.000000E-03 
        -9.000000E-04 -1.680000E-02 0.00000  4.700000E-03 2.000000E-03 3.000000E-04 2.700000E-03 2.800000E-03 
        -1.560000E-02 0.00000  0.00000  0.00000  0.00000  0.00000  -3.200000E-03 -7.920000E-02 
        -0.131600  0.302200  0.00000  0.00000  0.00000  0.00000  0.00000  3.000000E-04 
        -2.000000E-03 1.300000E-03 0.00000  0.00000  -3.300000E-03 0.00000  0.00000  0.00000  
         0.00000  0.00000  0.00000  0.00000  0.00000  -1.180000E-02 1.880000E-02 

문자 코드 (cmfa, CMFB 등)이다 (3 /> 30,000 참조). 각 문자 코드 변수는 다음 텍스트 블록 각각에 대해 동일한 위치에있는 번호와 관련됩니다.

숫자의 첫 번째 블록은 관측 값 0, 다음 관측 블록 1, 30,000 관측 값 이상입니다.

텍스트 파일 (바람직하게 .csv)로 바꾸는 방법을 찾고 싶습니다. 필자의 텍스트 예제의 경우 63 개의 열과 3 개의 행 (식별자의 경우 +1)을 갖습니다. 각 열은 해당 문자 코드 (cmfa 등)

가능한 경우와 제목이 될 것입니다, 우리는 컬럼의 수와 관찰

+0

은 당신이 지금까지 시도 했습니까? 간단한 해결책 : 공백이나 탭을 쉼표로 바꾸는 것보다 vi (유닉스) 나 notepad ++ (win)과 같은 정규 표현식을 사용하는 텍스트 프로세서를 사용하고 단일 개행을 공백이나 탭으로 대체 할 수 있습니다. –

답변

1

임의의 수의 파일에서 구문 분석 할 수있는 방법을 실행하려면이 싶습니다 당신은 간단한 파이썬을 사용하여 (파일의 행 수의 독립적 인) 제공 한 파일은, 더 나은 구현은 정규 표현식을 사용하여 수행 할 수 있지만 더 노력하는 나는 그것을 떠날 것이다 :

#Importing required libraries 
import numpy as np 
import csv 

#Open input file 
with open('input.txt','rb') as f: 
    line = f.read().splitlines() 

#Read file and do some parsing 
line2 = [] 
for l in line: 
    z = l.split(" ") 
    l2 = [] 
    for val in z: 
     if not(val==''): 
      l2.append(val) 
    if len(l2)==9: 
     line2.append(l2[1:9]) 
    elif len(l2)==7 or len(l2)==8: 
     line2.append(l2) 

#Remove unnecessary rows and do type conversion to float 
pl = np.arange(0,len(line2)+1,8) 
line3 = [] 
for i in np.arange(0,len(pl)-1): 
    z = line2[pl[i]:pl[i+1]] 
    z2 = [item for sublist in z for item in sublist] 
    if i==0: 
     line3.append(z2) 
    else: 
     line3.append([float(i) for i in z2]) 

#Write to output file 
with open('output.csv','wb') as f: 
    wr = csv.writer(f) 
    for row in line3: 
     wr.writerow(row) 

을 경우 유지하려는 색인 :

#Importing required libraries 
import numpy as np 
import csv 

#Open input file 
with open('input.txt','rb') as f: 
    line = f.read().splitlines() 

#Read file and do some parsing 
line2 = [] 
for l in line: 
    z = l.split(" ") 
    l2 = [] 
    for val in z: 
     if not(val==''): 
      l2.append(val) 
    if not(len(l2)==0): 
     line2.append(l2) 

#Remove unnecessary rows and do type conversion to float 
pl = np.arange(0,len(line2)+1,8) 
line3 = [] 
for i in np.arange(0,len(pl)-1): 
    if i==0: 
     z = line2[pl[i]:pl[i+1]] 
     z2 = [item for sublist in z for item in sublist] 
     line3.append(['']+z2) 
    else: 
     z = line2[pl[i]:pl[i+1]] 
     z2 = [item for sublist in z for item in sublist] 
     line3.append([float(i) for i in z2]) 

#Write to output file 
with open('output.csv','wb') as f: 
    wr = csv.writer(f) 
    for row in line3: 
     wr.writerow(row) 
+0

감사합니다 Gaurav! 이것은 제가 요구했던 것과 정확히 같습니다. 관측 번호가 csv의 첫 번째 열로도 (이 경우 0,1,2,3) 잘 기록 될 수 있는지 여부를 묻는 것을 잊었습니다. csv에서도 그렇게 할 수 있을까요? – bigCow

+0

obs 번호가 포함 된 것으로 수정되었습니다. 건배!! 괜찮다고 생각되면 올바른 것으로 표시하십시오. –

+0

다시, 내가 물었던 것과 똑같이 대답했다. 내 실수로, 새 ID 필드의 이름을 'ID'또는 'FID'또는 이와 비슷한 이름으로 지정할 수 있는지 묻는 것을 잊었습니다. – bigCow

0

mmap과 정규식을 사용하여 파일 전체를 메모리로 읽어 들이지 않고 파일을 구문 분석 할 수 있습니다.

뭔가 같은 :

이 가 가
import re 
import mmap 
import os 

size=os.stat(fn_in).st_size 

with open(fn_in, "r") as fin, open(fn_out, "w") as fout: 
    data = mmap.mmap(fin.fileno(), size, access=mmap.ACCESS_READ) 
    for idx, m in enumerate(re.finditer(r"(.*?)(?:(?:^\s*$)|\Z)", data, re.M | re.S)): 
     block=m.group(0).strip() 
     if not block: 
      continue 
     if idx==0: 
      fout.write("O_N,"+",".join(block.split())+"\n") 
     else: 
      fout.write(",".join(block.split())+"\n")