如何批量拆分含多表格的.dat数据文件?
自动化处理.dat性能数据表方案
核心思路
用Python结合pandas和numpy实现批量文件解析,按PROP RPM拆分数据并构建3D数组,同时支持NaN的跳过或插值填充处理。
单文件解析实现
import pandas as pd import numpy as np from scipy.interpolate import interp1d def parse_prop_dat(file_path, handle_nan='interpolate'): """ 解析单个.dat文件,按PROP RPM拆分数据并构建3D数组 :param file_path: .dat文件路径 :param handle_nan: NaN处理方式,可选'interpolate'(插值)或'skip'(跳过) :return: 3D数组(形状:[RPM组数, 数据行数, 特征列数]),以及对应的RPM列表 """ with open(file_path, 'r') as f: lines = [line.strip() for line in f if line.strip()] rpm_blocks = {} current_rpm = None header = None data_rows = [] for line in lines: # 识别PROP RPM块的起始 if line.startswith('PROP RPM ='): # 保存上一个RPM的数据(如果存在) if current_rpm is not None and header is not None and data_rows: df = pd.DataFrame(data_rows, columns=header) # 处理NaN if handle_nan == 'skip': df = df.dropna() elif handle_nan == 'interpolate': # 按V列插值填充NaN df = df.interpolate(method='linear', axis=0, limit_direction='both') rpm_blocks[current_rpm] = df.to_numpy() # 提取当前RPM值 current_rpm = int(line.split('=')[-1].strip()) header = None data_rows = [] # 识别表头行 elif line.startswith('V J Pe'): # 清理表头,合并括号里的单位说明 next_line = lines[lines.index(line)+1].strip() full_header = [f"{col} ({unit})" if unit else col for col, unit in zip(line.split(), next_line.split())] header = full_header # 识别数据行(判断是否为数值开头) elif line[0].isdigit() or line[0] == '-': # 拆分数值,处理可能的NaN(文件中空白视为NaN) values = [float(v) if v else np.nan for v in line.split()] data_rows.append(values) # 处理最后一个RPM块 if current_rpm is not None and header is not None and data_rows: df = pd.DataFrame(data_rows, columns=header) if handle_nan == 'skip': df = df.dropna() elif handle_nan == 'interpolate': df = df.interpolate(method='linear', axis=0, limit_direction='both') rpm_blocks[current_rpm] = df.to_numpy() # 构建3D数组,按RPM升序排列 sorted_rpms = sorted(rpm_blocks.keys()) three_d_array = np.array([rpm_blocks[rpm] for rpm in sorted_rpms]) return three_d_array, sorted_rpms
批量处理多个文件
import os def batch_process_dat_files(folder_path, handle_nan='interpolate'): """ 批量处理指定文件夹下的所有.dat文件 :param folder_path: 存放.dat文件的文件夹路径 :param handle_nan: NaN处理方式 :return: 字典,键为文件名,值为(3D数组, RPM列表) """ results = {} for filename in os.listdir(folder_path): if filename.endswith('.dat'): file_path = os.path.join(folder_path, filename) arr, rpms = parse_prop_dat(file_path, handle_nan) results[filename] = (arr, rpms) return results
使用示例
# 处理单个文件 arr, rpms = parse_prop_dat('13x8E.dat', handle_nan='interpolate') print(f"识别到的RPM值: {rpms}") print(f"3D数组形状: {arr.shape}") # 批量处理文件夹 folder_results = batch_process_dat_files('./prop_data', handle_nan='skip') for fname, (arr, rpms) in folder_results.items(): print(f"文件 {fname}: 包含 {len(rpms)} 组RPM数据,数组形状 {arr.shape}")
关键说明
- RPM块识别:通过匹配
PROP RPM =行拆分不同转速的数据块,自动提取表头和数值行 - NaN处理:
- 跳过模式:直接删除包含NaN的行
- 插值模式:按
V (mph)列的线性插值填充NaN,保证数据连续性
- 3D数组结构:维度为
[RPM组数, 该转速下的数据行数, 特征列数],方便后续性能分析或可视化 - 批量处理:遍历指定文件夹下所有.dat文件,自动完成解析并返回结果字典
内容的提问来源于stack exchange,提问作者Douglas
相关产品推荐
相关产品推荐

