2016-08-02 4 views
0

Pythonを使用してPEST解析によって生成されたトリッキーなテキストファイルを解析する方法を見つけようとしています。これは、30,000以上の観察について63の異なる変数の測定値を示しています。ここで出力の例です63個の変数の名前はPython parse 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(unix)やnotepad ++(win)のような正規表現を持つテキストプロセッサを使用して空白やタブをコンマで置き換えるよりも空白やタブに置き換えることができます。 –

答えて

1

、任意の数の上で解析するための方法を実行したいと思いますあなたが簡単なのpythonを使用して(ファイルの行数に依存しない)を提供しているファイル、より良い実装は、正規表現を使用して行うことができますが、あなたはさらにしようとするために、私はそれを残すだろう:

#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") 
関連する問題