首先,我们看一下lt6文件的存储内容和格式:
因为文件较多还需要动态生成文件夹和文件重命名:
% 按轨迹提取坐标点
% 提取LT6文件的三维坐标数据,按每一条轨迹数据为单位存储
disp('开始提取坐标值!!!')
for i = 1:5
% 将char型数据转换为字符串
temp_i = num2str(i);
% 根目录(相对路径)
root_str = 'wh_data/';
% 动态更新文件夹名称
folder_name = 'SFO2006Q1-';
% 完成更新后的文件夹名称
temp_str = strcat(folder_name,temp_i);
% 拼接字符串,存储文件的相对路径
relative_path = strcat(root_str,temp_str);
% 遍历文件夹下的文件
file = dir(relative_path);
len = length(file);
% 循环条件的设置是因为文件中开始和结束都有其它不同的文件
for j = 3:len-2
% 在此循环开始打开每一个文件,利用extact_track_txt函数进行三维坐标信息的提取
% 取出每一个lt6文件的文件名称
file_txt_name = file(j).name;
% 字符串分割
temp = split(file_txt_name,'.');
% 每一个lt6文件的相对路径
a = strcat('/',file_txt_name);
path = strcat(relative_path,a);
% 调用提取txt文件中三维坐标点的函数extact_track_txt
[lines,row,Total] = extract_track_txt_new(path);
% 存储的名称为‘*.mat’
% store_name = strcat(temp{1,1},'.mat');
save(['mat数据\',temp{1,1}],'Total');
end
end
其中,需要一个打开txt文件的函数extract.m(function):
function [lines,row,Total] = extract_track_txt_new(path)
% 提取lt6文件中三维空间坐标点
% path:提取的文件路径
% every_lt6:里面存储的是三维空间坐标点
% 打开文件(以下的路径方式都可以打开)
% f = fopen('.\wh_data\SFO2006Q1-1\20060101.lt6');
% f = fopen('wh_data\SFO2006Q1-1\20060101.lt6');
% 打开文件
file_id = fopen(path);
% 存放每一个lt6文件的三维坐标点的mat矩阵
every_lt6 = {};
% 初始化文件行数
lines = 0;
% 存储矩阵every_lt6的行数
row = 1;
% 航班号
n_track = 0;
% 控制变量
flag = 1;
% feof:检测是否是文件末尾
while ~feof(file_id)
% 读取每一行
file = fgetl(file_id);
% 当某个字符串中包含TRACK字符,在第二次出现TRACK字符之前,这就是一条独立的轨迹
if contains(file,'TRACK')
% 更新存储矩阵的行号
n_track = n_track + 1;
% 提取出的字符串存储在元组中
track_name = textscan(file,'%s');
% 需要将其拼接成航班号%%%%%
track_name = strcat(track_name{1,1}{1,1},track_name{1,1}{2,1});
% 存储
Total(n_track).flight = track_name;
if flag ~= n_track
% 将点的数据赋值给上一行
Total(n_track-1).track = every_lt6;
% 重置参数
every_lt6 = {};
row = 1;
flag = flag + 1;
end
% 更新lt6的总行号
lines = lines + 1;
% 只有三维坐标点的行中有行号,其余都没有,所以判断有没有逗号作为判断条件
elseif contains(file,',')
% 读取每一行的三维坐标点
content = textscan(file,'%d %d %d %d %d','Delimiter',',');
% 将每一维坐标从cell中取出,放入到矩阵中
for i = 1:3
every_lt6{row,i} = content{1,i};
end
% 更新存储矩阵的行号
row = row + 1;
% 更新lt6的总行号
lines = lines + 1;
else
% 更新行号
lines = lines + 1;
end
end
Total(n_track).track = every_lt6;
% 关闭文件
fclose(file_id);
end