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 を持つすべてのデータ グループに対して 2 次元配列 (テーブル) を作成する必要があります。

それらのいずれかが変更されるたびに、新しい配列を作成する必要があります。

正規表現を使用して、MACH NO、ALTITUDE、および SIDESLIP 広告チェックの横にある値が変更されたかどうかを読み取ることになっていますが、非常に複雑な方法のように思えます。あなたのアプローチは何ですか?

私はPythonを使用することを考えていました。

4

2 に答える 2

1

編集:以下は、仕事をしているコードです。正規表現についてより多くの知識を得るためにこのトピックに取り組むことにしたので、最終的なコードに正規表現がないため、少しイライラしてしまいます。誰かが適切な場所で正規表現を使用するのを手伝ってくれることを願って、解析コードのさまざまな部分を以下に要約させてください - 正規表現が役に立ちそうな場所を1つだけ見つけましたが、場合。お気軽にコメントください。

1/文字列「FLIGHT CONDITIONS」がある行を探して、ファイルをブロックに分割します-正規表現は役に立たないと思います

2/ブロックを 2 つの部分に分割します: 最初の部分は hdr です: 次の行のような形式の複数の行: MACH NUMBER = 0.67 REYNOLDS NU = 2.05E5 /M おそらく、これはここで正規表現が役立つ場所です: 代わりに行を ' ' で分割する方法、正規表現がこの行から有用な情報をどのように抽出できたでしょうか [('MACH NUMBER', 0.67), ('REYNOLDS NU', 2.05E5))

3/ 分割された可能性のあるデータ配列をマージする => 正規表現が役に立ったかどうかわかりません。


これは、仕事をしているコードの一部です。そこから始めて、ご希望の形にしていただければと思います。一言で説明しましょう:

最初のステップは、ファイルをブロックに分割できるようにすることです。ブロックは FLIGHT CONDITIONS で分割されます。

2 番目のステップは、ブロックを 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 に答える