0

我的问题是关于解析 Missile Datcom 的输出,我不知道是否有人知道。文件的长度是可变的。

我的目标是检索存储在这些表中的所有数据并将其保存在正确的文件结构中(我认为是 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

您可以在其中获取与表格相关的输入数据:MACH NO、ALTITUDE、SIDESLIP。

我必须为每组具有相同 MACH NO、ALTITUDE 和 SIDESLIP 的数据创建一个二维数组(一个表)。

每次其中一个发生变化时,我都必须创建一个新数组。

我应该使用正则表达式来读取 MACH NO、ALTITUDE 和 SIDESLIP 广告旁边的值,检查它们是否已更改,但在我看来这是一个非常复杂的方法。你的方法是什么?

我正在考虑使用Python。

4

2 回答 2

1

编辑:下面是一段正在完成工作的代码。由于我决定研究这个主题以获得更多关于正则表达式的知识,我最终有点沮丧,因为最终代码中没有正则表达式。让我在下面总结一下解析代码的不同部分,希望有人可以帮助在正确的地方使用正则表达式 - 我发现只有一个地方正则表达式可能会有所帮助,但也许还有其他地方可能是案子。随意发表评论。

1/通过查找存在字符串'FLIGHT CONDITIONS'的行将文件分成块-我猜没有正则表达式有用

2/将一个块分成两部分:第一个带有 hdr:几行,格式如下:MACH NUMBER = 0.67 REYNOLDS NU = 2.05E5 /M 也许这是一个地方,正则表达式可能会有所帮助:相反用''分割线,正则表达式如何从这条线中提取有用的信息让我们说[('MACH NUMBER',0.67),('REYNOLDS NU',2.05E5))

3/合并可能拆分的数据数组=>我看不出正则表达式是否有用。


这是一段正在完成这项工作的代码。我希望你可以从它开始拥有你想要的格式。让我用几句话解释一下:

第一步是能够将您的文件分成块:块用飞行条件分隔。

第二步是将一个块拆分为 hdr(存储飞行条件的详细信息)和原始数据。

飞行条件的详细信息存储在 dct (hdr_dct) 中,原始数据存储在列表 (data_lst) 中,其中 data_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()
于 2013-03-23T21:10:32.910 回答
0

你总是可以使用类似的东西

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

C=regexp(char(A'),'[\s ,]','split');

C 将是一个由字符串 (C{1} C{2} C{3} ...) 组成的元胞数组,这些字符串是通过用空格拆分文件获得的。通过跟踪索引并应用 str2num,您应该能够获得所需的数据。

编辑

此外,strcmp 将与 C 一起使用。因此,例如,如果您想查找 SIDESLIP 发生的单元格索引,您可以执行

n=find(strcmp(C,'SIDESLIP'));
于 2013-03-23T21:02:47.217 回答