2013-03-23 3 views
0

Мой вопрос заключается в разборе вывода Missile Datcom, я не знаю, знает ли кто-нибудь это. Длина файла является переменной.Как анализировать файл .dat без повторяющихся структур

Моя цель - получить все данные, хранящиеся в этих таблицах, и сохранить их в правильной файловой структуре (я думаю, файл 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, ВЫСОТА, скольжение.

Мне нужно создать 2-мерный массив (таблицу) для каждой группы данных, имеющих одинаковые MACH NO, ALTITUDE и SIDESLIP.

Каждый раз, когда один из них меняет, я должен создать новый массив.

Я должен использовать регулярное выражение для чтения значений рядом с маркером MACH NO, ALTITUDE и SIDESLIP, если они были изменены, но мне кажется, что это довольно запутанный метод. Каким будет ваш подход?

Я думал об использовании Python.

ответ

0

Вы всегда можете использовать что-то вроде

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

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

C будет массив ячеек, состоящий из строк (C {1} C {2} C {3} ...), полученный разбивая файл по пробельные. Следя за индексом и применяя str2num, вы сможете получить нужные данные.

редактировать

Кроме того, зЬгстр будет работать с C. Так, например, если вы хотите, чтобы найти то, что индекс ячейки скольжения происходит вы можете сделать

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

EDIT: Ниже кусок код, который выполняет работу. Поскольку я решил работать над этой темой, чтобы получить больше знаний о регулярном выражении, я в конечном итоге немного расстроен, так как в конечном коде нет регулярного выражения. Позвольте мне кратко изложить следующую часть кода синтаксического анализа, надеясь, что кто-то может помочь использовать регулярное выражение в нужном месте - я нашел только одно место, где регулярное выражение могло бы быть полезным, но, возможно, есть и другие места, где это может быть дело. Не стесняйтесь комментировать.

1/разбить файл на блоки, ища линий, где есть строка «УСЛОВИЯ ПОЛЕТА» - нет регулярных выражений полезно я думаю

2/разделить блок на две части: первый с РВБ: несколько строк с таким форматом, как следующая строка: MACH NUMBER = 0.67 REYNOLDS NU = 2.05E5/M Возможно, это место, где могло бы быть полезно regexp: вместо того, чтобы разделить строку на '', regexp извлекли из этой строки полезную информацию, скажем, [('MACH NUMBER', 0.67), ('REYNOLDS NU', 2.05E5))

3/merge, возможно, разбитый массив данных => Я не вижу, было ли 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() 
Смежные вопросы