前言
最近在处理数据的时候,遇到了一个关键问题,如何从众多的同类型文件中筛选指定名称的文件到另一文件下,比如我现在有按照时间序列生成的2000-2020若干天的tif数据,但我想把每年的天数据放到一个年份文件夹下。比如2000年的天数据放到2000的文件夹下。如果是小时呢?如果时间序列更长怎么办?手动此时不如放弃不做了。
电脑是个好东西,这里会用到MATLAB生成指定文件名和文件夹,以及采用dos命令来批量分配,笔者亲身试验,比各位一个一个筛选省去至少若干天的时间。
二、具体步骤
首先要生成可以读取的txt文件,这个文件中是要筛选的文件名,当然程序是针对有规律命名的文件,没有规律的可以先将需要的名称找出来,存成txt,有也可以批量改文件名,让他们有规律。然后开始按照年循环将需要的文件筛选出来,然后生成对应分组的空文件夹。
1.数据准备
clc;
clear;
close all;
% 定义路径
base_dir = 'H:\';
% 定义年份
for yyear = 2000:1:2020
% 构建动态的 imgdir
imgdir = fullfile(base_dir, num2str(yyear), filesep);
filenames=dir([imgdir '*.tif']);
days=[];
for ii=1:numel(filenames)
name=filenames(ii).name;
day=name(end-7:end-4);
days=[days;day];
end
ddays=str2num(days);
% 构建起始日期字符串
start_date_str = sprintf('%d-01-01', yyear+1);
% 定义结束日期的字符串
end_date_str = sprintf('%d-12-31', yyear+10);
% 将字符串转换为 datetime 类型
start_date = datetime(start_date_str);
end_date = datetime(end_date_str);
% 生成日期序列
date_sequence = start_date:end_date;
% 提取年份
years = year(date_sequence)';
data=[years,ddays];
for yea=yyear+1:1:yyear+10
yeardata=data(data(:,1)==yea,:);
yeardata=yeardata(:,2);
formatted_data = arrayfun(@(x) sprintf('data_%d_%d.%04d',yyear+1,yyear+10,x), yeardata, 'UniformOutput', false);%根据文件名称来确定需要的格式名称
% 将单元格数组转换为字符型数组
formatted_data_char = char(formatted_data);
output_path = 'E:\Future DWE\dwiname\';
disp(yea)
filename = sprintf('%d.txt', yea);
% 合并路径和文件名
full_filepath = fullfile(output_path, filename);
% 打开或创建一个名为 formatted_data.txt 的文件
fileID = fopen(full_filepath, 'w');
% 将 formatted_data 中的每个元素写入文件
for i = 1:numel(formatted_data)
fprintf(fileID, '%s\n', formatted_data{i});
end
% 关闭文件
fclose(fileID);
end
%这部分是生成空的年的文件夹,如果文件夹很多,可以指定MATLAB来生成,不用一个一个生成
% % 定义起始年份和结束年份
% start_year = 2000;
% end_year = 2020;
%
% % 定义文件夹保存的路径
% output_path = 'E:\';
%
% % 循环生成文件夹
% for year = start_year:end_year
% % 构建文件夹名
% foldername = sprintf('%d', year);
%
% % 合并路径和文件夹名
% full_folderpath = fullfile(output_path, foldername);
%
% % 创建文件夹
% mkdir(full_folderpath);
%
% disp(['已生成文件夹: ' full_folderpath]);
% end
2.批量筛选
这是筛选tif格式的文件,move前表示需要筛选的文件夹,move后表示放到新文件下的位置,下面这段代码先构建成txt,然后修改后缀为.bat,双击让电脑批量提取即可。注意bat要和txt放到同一文件夹下,以下是筛选tif格式的文件,需要别的格式可以改后缀。
@for /f %%i in (2021.txt) do if exist "H:\BaiduSyncdisk\2020\%%i.tif" move "H:\BaiduSyncdisk\2020\%%i.tif" "H:\BaiduSyncdisk\2020\2021"
@for /f %%i in (2022.txt) do if exist "H:\BaiduSyncdisk\2020\%%i.tif" move "H:\BaiduSyncdisk\2020\%%i.tif" "H:\BaiduSyncdisk\2020\2022"
@for /f %%i in (2023.txt) do if exist "H:\BaiduSyncdisk\2020\%%i.tif" move "H:\BaiduSyncdisk\2020\%%i.tif" "H:\BaiduSyncdisk\2020\2023"
总结
重复性的工作就交给电脑吧,不要人为去筛选,太费时费力了,关键还费神。
记录科研中处理数据通用的代码,顺手发到CSDN上造福广大科研民工,欢迎关注我的公众号,获取更多科研代码和前沿论文资讯等相关内容