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


前言

最近在处理数据的时候,遇到了一个关键问题,如何从众多的同类型文件中筛选指定名称的文件到另一文件下,比如我现在有按照时间序列生成的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、本程序可以作什么? 本程序功能分为两个部分: 一部分是:批量查找指定路径下的文件的内容,是否包含要查询的项目。并把查询的内容分文件存储。 一部分是:将文本文件导入EXCEL,可以将上一步查找的结果导入,也可以自己选择文件导入(支持多选)。 2、如何使用他? a、批量查找: 首先,在“读入位置”按钮处设置你所要读取的文件的存放位置,此时程序会自动读入此文件夹下所有文件,以供选择;其次,用“>>”或“>”将要读取的文件选入读取队列,当然如果选错了可以用“<<”或“<”删除队列,或者鼠标双击选项删除;再次,点击“+”按钮,添加查找项目到查找项目列表,一次只可以添加一条,如需添加多条则需要重复添加操作;如果添加错误可以双击选项删除或选后点击“-”按钮。最后,点击“开始查找”,程序将会把查找结果输保存到指定路径下面的output文件夹下面,你可以选择是否打开目录查看。如果需要查询的文件文件头,可以选择“保留文件首行”。 b、EXCEL导入: 首先,选择导入方式,导入方式分为“查询结果导入”和“新选文件导入”两种;当选择“查询结果导入”时,本程序将把“读入位置”处“output”文件夹文件批量导入EXCEL。当选择“新选文件导入”时,本程序在点击“开始导入”时将弹窗口,您可以自己选择需要导入文件(支持多选),导入EXCEL。其次,设置导入文件时的分割符,默认为“|”,本程序只支持按照分隔符导入。最后,点击“开始导入”按钮开始导入。 3、本程序不判断所查找的文件类型 由于本程序在读入文件时,并没有校验文件的内容和文件类型,因此本程序会读取用户所选择的任意文件,即使此文件是二进制格式的。不论是查询或者是导入功能都是这样。本程序将按行读取所选择的文件(或者有换行符的),在读取完文件后,无论是否找到,都会创建和源文件相同类型的文件,即使是.exe或.rar(一般是打不开的),文件名存储为“output”+原文件名。即使没有找到任何相匹配的内容,本程序也会创建文件,这时后文件大小是0字节,可以按照大小排列看到。 4、请使用“清除文件”按钮及时清除查询结果 程序在查询和创建文件的过程,不会判断是否已经执行过查询操作。如果已经执行过查询操作,“output”文件夹下就会存在查询文件,当再次执行查询时,本程序会在已存在的文件后追加查询结果。这样就会现重复的记录或内容。因此,当需要多次查询时,每次查询前需要点击“清空文件”按钮删除output文件夹,才能保证查找的准确。 5、本程序不会判断运行的环境,因此在运行过程可能会有些未知的错误 本程序在win7环境,vs2012,Netframe4.0下编译通过。本程序支持winxp及以上操作系统。执行EXCEL导入的时候,需要安装Office。Office的版本在2003以上就可以。但是不同我Office版本对导入性能,有一定的影响。Excel2003,最多256列,即2的8次方,最多65536行,即2放入16次方; Excel2007及以上版本,最多16384列,即2的14次方,最多1048576行,即2的20次方。因此如果需要导入的单个文件的行数或者列数,超过了所安装Office版本的最多行列数,程序将会报错!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值