我有这样的一个i文件集合:2015年的所有年积日的I文件集合,我要通过批量整理出来,以便于我进行电离层TEC经纬度格网点的数据提取。下面是步骤和我走的弯路:
![](https://img-blog.csdnimg.cn/2947c0cad2894a3fb20d22b2dc52f994.png)
刚开始我准备使用matlab进行处理,像这样。其中读取和解压的目标文件夹都在桌面:
% 指定源文件夹,包含要解压的Z文件
sourceFolder = 'C:\Users\韩蔡\Desktop\2015';
% 指定目标文件夹,这是您希望将解压后的文件保存到的文件夹
targetFolder = 'C:\Users\韩蔡\Desktop\2015 IONEXData';
% 获取源文件夹中的所有.Z文件
compressedFiles = dir(fullfile(sourceFolder, '*.Z'));
% 遍历每个压缩文件并解压缩到目标文件夹
for i = 1:length(compressedFiles)
% 构建压缩文件的完整路径
compressedFilePath = fullfile(sourceFolder, compressedFiles(i).name);
% 构建解压后的文件的完整路径,保持与原始文件名相同(去除.Z扩展名)
[~, filename, ~] = fileparts(compressedFiles(i).name);
uncompressedFilePath = fullfile(targetFolder, filename);
% 使用系统命令解压缩文件(前提是系统支持uncompress或gunzip命令)
system(['uncompress ' compressedFilePath]);
% 移动解压后的文件到目标文件夹
movefile(filename, targetFolder);
end
disp('解压缩完成');
但是这个由于没有对Z文件进行解压缩的工具,实现不了,总是会报错。
data_compress
'uncompress' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
错误使用 movefile
C:\Users\韩蔡\Desktop\casg0010.15i: 权限被拒绝。
请使用 'f' 选项覆盖。出错 data_compress (第 23 行)
movefile(filename, targetFolder);
换成VC++进行相关的尝试:
#include <iostream>
#include <fstream>
#include <filesystem>
#include <string>
int main() {
// 指定源文件夹,包含要解压的.Z文件
std::string sourceFolder = "C:\\Users\\韩蔡\\Desktop\\2015";
// 指定目标文件夹,这是您希望将解压后的文件保存到的文件夹
std::string targetFolder = "C:\\Users\\韩蔡\\Desktop\\2015 IONEXData";
// 获取源文件夹中的所有.Z文件
for (const auto& entry : std::filesystem::directory_iterator(sourceFolder)) {
if (entry.path().extension() == ".Z") {
// 构建压缩文件的完整路径
std::string compressedFilePath = entry.path().u8string();
// 构建解压后的文件的完整路径,保持与原始文件名相同(去除.Z扩展名)
std::string filename = entry.path().stem().u8string();
std::string uncompressedFilePath = targetFolder + "\\" + filename;
// 使用7-Zip解压缩文件
std::string command = "7z x \"" + compressedFilePath + "\" -o\"" + targetFolder + "\"";
int result = system(command.c_str());
if (result == 0) {
// 移动解压后的文件到目标文件夹
std::string moveCommand = "move \"" + filename + "\" \"" + targetFolder + "\"";
system(moveCommand.c_str());
}
}
}
std::cout << "解压缩完成" << std::endl;
return 0;
}
还是不行,所以我直接下载这个7-ZIP,抱着试一下的心态
下载完这个之后,点开自己下载的路径,找到exe文件在的地方,搜索一下chatGPT询问下该怎么进行相关的操作?
% 使用cmd窗口直接实现数据的解压缩,Z文件夹的批量解压缩
cd C:\Users\韩蔡\Desktop\2015
Get-ChildItem *.Z | ForEach-Object { & "D:\set up bag\7-Zip\7z.exe" e $_.FullName -o"C:\Users\韩蔡\Desktop\2015 IONEXData" }
% 使用cmd窗口直接实现数据的解压缩,Z文件夹的批量解压缩
cd C:\Users\韩蔡\Desktop\2015
Get-ChildItem *.Z | ForEach-Object { & "D:\set up bag\7-Zip\7z.exe" e $_.FullName -o"C:\Users\韩蔡\Desktop\2015 IONEXData" }
使用这两行命令提示符号就可以实现批量读取了,最好是一行一行地输入命令进行读取
![](https://img-blog.csdnimg.cn/fafaf64c2d004d6fb7e3a297828322e7.png)
所以下面就可以把这365天的数据(已经提取为15I文件)进行处理了
后续的数据就是要进行相关的15I文件的读取和表格制作了。
进入matlab读取数据,最后就可以生成一个excel 表格
%% 注意:I文件不能和这个程序放在同一个文件夹下
clc;
clear all
%%
lat=[];%纬度
long=[];%经度
data_TEC=[];%TEC数据
Data=[];
data=[];
Data_TEC=[];
m=[];%一天内生成格网点数据的份数
data_n=[];
data_RMS = [];
[file_result,dirpath]=uiputfile('*.**i','Please pick a file');%保存结果
filestruct=dir(dirpath);
Nfile=length(filestruct); %%---计算文件夹内文件个数----
% hwait=waitbar(0,'请等待>>>>>>>>');
tic
%% 读取I文件部分
for n=1:Nfile
if strcmp(filestruct(n).name,'.') || strcmp(filestruct(n).name,'..')
continue;
end
fid1=fopen([dirpath,'\',filestruct(n).name],'r');
b=filestruct(n).name;
while ~feof(fid1)
temp=fgets(fid1);
if strfind(temp,'START OF TEC MAP')
m=str2num(temp(4:7));
nn=3*(m-1)+2;
temp2=fgets(fid1);
if nn<=26
bb=[char(65+nn-1),'2'];
elseif (nn>26)&&(nn<=52)
bb=['A',char(65+nn-1-26),'2'];
elseif (nn>52)&&(nn<=78)
bb=['B',char(65+nn-1-52),'2'];
end
bb1=bb;
bb1(end)='3';
elseif strfind(temp,'LAT/LON1/LON2/DLON/H')
lat1=str2num(temp(3:8));
lat=[lat;lat1*ones(73,1)]; %纬度
ind1=str2num(temp(9:15)); %%---提取起始格网经度---
ind2=str2num(temp(16:21)); %%---提取终止格网经度---
for i=1:(ind2-ind1)/5+1 %%--计算经度格网数----
long=[long;ind1+5*(i-1)];
end
temp1=fgets(fid1);
data=[data;sscanf(temp1,'%f')];
temp1=fgets(fid1);
data=[data;sscanf(temp1,'%f')];
temp1=fgets(fid1);
data=[data;sscanf(temp1,'%f')];
temp1=fgets(fid1);
data=[data;sscanf(temp1,'%f')];
temp1=fgets(fid1);
data=[data;sscanf(temp1,'%f')];
elseif strfind(temp,'END OF TEC MAP')
data_TEC=[data_TEC,data];
data_grid=[lat,long];
Data_TEC=[data_grid data_TEC];
bb2=bb;
bb2(end)='4';
lat=[];long=[];data=[];%清空
elseif strfind(temp,'START OF RMS MAP')
m=str2num(temp(4:7));
nn=3*(m+13-1)+2+1;
temp2=fgets(fid1);
if nn<=26
bb=[char(65+nn-1),'2'];
elseif (nn>26)&&(nn<=52)
bb=['A',char(65+nn-1-26),'2'];
elseif (nn>52)&&(nn<=78)
bb=['B',char(65+nn-1-52),'2'];
end
bb1=bb;
bb1(end)='3';
elseif strfind(temp,'END OF RMS MAP')
data_RMS=[data_RMS,data];%TEC的RMS其实是可以忽略的
bb2=bb;
bb2(end)='4';
lat=[];long=[];data=[];%清空
end
end
toc
end
fclose('all');
%% 对读取出来的数据进行相应操作
tic;
data_all=[];data_all_RMSE=[];
for days=1:Nfile-2 %循环的最大数值起始就是一年的天数
data_all_Temp=data_TEC(:,97*(days-1)+1:97*(days-1)+96);
data_all=[data_all data_all_Temp];
data_all_Temp_RMSE=data_RMS(:,97*(days-1)+1:97*(days-1)+96);
data_all_RMSE=[data_all_RMSE data_all_Temp_RMSE];
end
data_all_out=[data_grid data_all*0.1];
data_all_out_RMSE=[data_grid data_all_RMSE];
toc;
tic;
csvwrite('C:\Users\韩蔡\Desktop\2015 IONEXData\1.csv',data_all_out);
% csvwrite('E:\GNSSData\CAS(15min)\已提取\RMSE\2019.csv',data_all_out);
toc;