下载7-ZIP使得win-cmd可以实现批量提取Z类型文件

       我有这样的一个i文件集合:2015年的所有年积日的I文件集合,我要通过批量整理出来,以便于我进行电离层TEC经纬度格网点的数据提取。下面是步骤和我走的弯路:

2015年的电离层数据,压缩类型:Z类型   I文件夹

 刚开始我准备使用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" }

使用这两行命令提示符号就可以实现批量读取了,最好是一行一行地输入命令进行读取

这是提取后的数据,总共是365天的压缩数据

所以下面就可以把这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;

这就是读取电离层格网数据的matlab代码

       但在这个相关的数据提取上,按照30天的数据都可以正常的提取,但是我直接将365天的数据进行提取的时候,得出的数据列是16384列数据,这还是包含经纬度前两列的数据。但是运行了十个小时的代码,我忘记看这个天数是不是180天了。不知道问题出在哪里。

       估计还是存在着问题的,因为三十天的数据很快就读取了,但是300天的并不是这个预估的时间,所以应该是在算法上存在着一些这样那样的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值