Python 如何在没有重复结构的情况下解析.dat文件
我的问题是关于分析导弹数据通信的输出,我不知道是否有人知道。文件的长度是可变的 我的目标是检索这些表中存储的所有数据,并将其保存在正确的文件结构中(我认为是MATLAB.mat文件)。我所能得到的唯一对称性是文本结构的重复,如下所示: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
***** 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()