如何从一个文件夹中众多的文件中筛选出指定的文件到另一文件夹下


前言

最近在处理数据的时候,遇到了一个关键问题,如何从众多的同类型文件中筛选指定名称的文件到另一文件下,比如我现在有按照时间序列生成的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上造福广大科研民工,欢迎关注我的公众号,获取更多科研代码和前沿论文资讯等相关内容
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值