Python 如何在没有重复结构的情况下解析.dat文件

Python 如何在没有重复结构的情况下解析.dat文件,python,matlab,parsing,numpy,Python,Matlab,Parsing,Numpy,我的问题是关于分析导弹数据通信的输出,我不知道是否有人知道。文件的长度是可变的 我的目标是检索这些表中存储的所有数据,并将其保存在正确的文件结构中(我认为是MATLAB.mat文件)。我所能得到的唯一对称性是文本结构的重复,如下所示: ***** THE USAF AUTOMATED MISSILE DATCOM * REV 3/99 ***** CASE 1 AERODYNAMIC METHODS FOR MISSILE CONFIGURATIONS

我的问题是关于分析导弹数据通信的输出,我不知道是否有人知道。文件的长度是可变的

我的目标是检索这些表中存储的所有数据,并将其保存在正确的文件结构中(我认为是MATLAB.mat文件)。我所能得到的唯一对称性是文本结构的重复,如下所示:

***** THE USAF AUTOMATED MISSILE DATCOM * REV 3/99 *****     CASE   1
           AERODYNAMIC METHODS FOR MISSILE CONFIGURATIONS          PAGE   2
               STATIC AERODYNAMICS FOR BODY-FIN SET 1

   ******* FLIGHT CONDITIONS AND REFERENCE QUANTITIES *******
 MACH NO  =       0.01                REYNOLDS NO = 2.318E+05 /M
 ALTITUDE =        0.0 M         DYNAMIC PRESSURE =      7.09 N/M**2
 SIDESLIP =      -5.00 DEG                   ROLL =      0.00 DEG     
 REF AREA =      0.006 M**2         MOMENT CENTER =     1.750 M
 REF LENGTH =     0.10 M           LAT REF LENGTH =      0.10 M

               ----- LONGITUDINAL -----     -- LATERAL DIRECTIONAL --
     ALPHA       CN        CM        CA        CY       CLN       CLL

    -15.00   -13.959    -4.106     2.661     4.031     1.817     0.565
    -12.50   -12.292    -1.954     5.103     4.302     1.267     0.449
    -10.00    -9.985    -0.720     7.148     4.600     0.677     0.253
     -7.50    -7.477    -0.030     7.516     4.833     0.143     0.073
     -5.00    -4.881     0.206     6.380     4.881    -0.206     0.000
     -2.50    -2.374     0.167     5.504     4.949    -0.509    -0.059
     -1.00    -0.933     0.069     5.287     4.965    -0.604    -0.036
      0.00     0.000     0.000     5.308     4.967    -0.623    -0.000
      1.00     0.933    -0.069     5.287     4.965    -0.604     0.036
      2.50     2.374    -0.167     5.504     4.949    -0.509     0.059
      5.00     4.881    -0.206     6.380     4.881    -0.206     0.000
      7.50     7.477     0.030     7.516     4.833     0.143    -0.073
     10.00     9.985     0.720     7.148     4.600     0.677    -0.253
     12.50    12.292     1.954     5.103     4.302     1.267    -0.449
     15.00    13.959     4.106     2.661     4.031     1.817    -0.565

     ALPHA       CL        CD      CL/CD     X-C.P.

    -15.00   -12.795     6.183    -2.069     0.294
    -12.50   -10.896     7.643    -1.426     0.159
    -10.00    -8.592     8.773    -0.979     0.072
     -7.50    -6.432     8.427    -0.763     0.004
     -5.00    -4.307     6.781    -0.635    -0.042
     -2.50    -2.132     5.602    -0.381    -0.071
     -1.00    -0.841     5.302    -0.159    -0.074
      0.00     0.000     5.308     0.000     2.298
      1.00     0.841     5.302     0.159    -0.074
      2.50     2.132     5.602     0.381    -0.071
      5.00     4.307     6.781     0.635    -0.042
      7.50     6.432     8.427     0.763     0.004
     10.00     8.592     8.773     0.979     0.072
     12.50    10.896     7.643     1.426     0.159
     15.00    12.795     6.183     2.069     0.294
您可以从中获得与表格相关的输入数据:马赫数、高度、侧滑

我必须为每组具有相同马赫数、高度和侧滑的数据创建一个二维数组(表)

每次其中一个发生更改时,我都必须创建一个新数组

我应该使用正则表达式来读取马赫数、高度和侧滑旁的值,如果它们发生了变化,则进行检查,但在我看来,这是一种非常复杂的方法。你的方法是什么


我正在考虑使用Python。

您可以随时使用

fid=fopen('yourfile');
A=fread(fid);
fclose(fid);

C=regexp(char(A'),'[\s ,]','split');
C将是一个单元格数组,由字符串(C{1}C{2}C{3}…)组成,这些字符串是通过将文件按空格分隔而获得的。通过跟踪索引并应用str2num,您应该能够获得所需的数据

编辑

另外,strcmp将与C一起工作。因此,例如,如果您想找到单元索引发生侧滑的原因,您可以这样做

n=find(strcmp(C,'SIDESLIP'));

编辑:下面是一段正在执行此任务的代码。由于我决定研究这个主题以获得更多关于regexp的知识,我最终有点沮丧,因为最终的代码中没有regexp。下面让我总结一下解析代码的不同部分,希望有人能在正确的地方帮助使用regexp-我发现只有一个地方regexp可能会有所帮助,但可能还有其他地方可以这样做。请随意评论

1/通过查找字符串“FLIGHT CONDITIONS”(飞行条件)所在的行,将文件分为多个块—我想没有可用的regexp

2/将块拆分为两部分:第一部分使用hdr: 多行格式如下所示: 马赫数=0.67雷诺数NU=2.05E5/M 也许这是一个地方,一个regexp可能会有所帮助: 一个regexp如何能从这一行中提取有用的信息,比如[('MACH NUMBER',0.67),('REYNOLDS NU',2.05E5]),而不是用“”拆分这一行

3/合并可能拆分的数据数组=>我看不出regexp是否有用


这是一段正在执行此任务的代码。我希望您可以从它开始,以获得所需的格式。让我用几句话来解释它:

第一步是能够将文件拆分为块:块根据飞行条件进行分隔

第二步是将块分割成hdr(其中存储飞行条件的详细信息)和原始数据

飞行条件的详细信息存储在dct(hdr_dct)中,原始数据存储在列表(data_lst)中,数据_hdr描述列表中的内容

import itertools
import sys

def parse_hdr(block) :
    """
    parsing the header of a block of data
    """
    parsed_hdr = {}
    for line in block :
        if '=' not in line :
            continue
        res = [e for e in line.split(' ') if len(e) >0] # remove white space
        match = False
        name = ''
        for e in res :
            if not match :
               if e == '=' :
                  match = True
               else :
                  name += e
            else :
               parsed_hdr[name] = float(e)
               name = ''
               match = False
    return parsed_hdr


def parse_data(block) :
    """
    parse the numerical data
    """
    hdr, res, block_id = [], [], -1
    for line in block :
        splitted_line = [e for e in line.split(' ') if len(e) > 0]
        if 'ALPHA' in splitted_line :
            hdr.extend(splitted_line)
            block_id += 1
            i_b = 0
        else :
            try :
                to_add = [float(e) for e in splitted_line]
            except :
                #print "skip : " + line
                sys.exc_clear()
                continue
            if block_id == 0 :
                res.append(to_add)
            else :
               res[i_b].extend(to_add)
            i_b += 1
    return hdr, res

def parse_block(block) :
"""
    parsing the data ofone block
"""
hdr_dct  = parse_hdr(block[:5])
data_hdr, data_lst = parse_data(block[6:])


def main() :
    block_limit ='    ******* FLIGHT CONDITIONS AND REFERENCE QUANTITIES *******'
    stt_data_lst = []
    end_data_lst = []

    with open('input.dat') as f :
       lines = f.readlines()
       for i_line, line in enumerate(lines) :
            if block_limit in line :
                stt_data_lst.append(i_line)

    end_data_lst = stt_data_lst[1:] + [-1]


    for stt, end in itertools.izip(stt_data_lst, end_data_lst) :
        parse_block([ee for ee in [e.strip() for e in lines[stt+1:end]] if len(ee) > 0])


main()