MATLAB批量读取文件夹名,文件名,文件数据


一、介绍

我们在研究一些课题时,经常会遇到大量的数据需要处理,在存在大量数据文件的时候,需要批量读取文件中的数据,将其转换为矩阵进行计算。
目前笔者要处理的数据是一个项目一个月的数据,如下图所示:
在这里插入图片描述
这里先创建一个在“D:/9月/1日”目录下命名为1日的文件夹,在文件夹中生成100个txt文件。

new_folder= 'D:/9月/1日'; % new_folder 保存要创建的文件夹,是绝对路径+文件夹名称
mkdir(new_folder);  % mkdir()函数创建文件夹
cd(new_folder)
for i=1:100  
  eval(['fid=fopen(''a',num2str(i),'.txt''',',','''a+''',');'])%写入文件路径
  fprintf(fid,'%.4f\r\n',rand(10,1)); 
  fclose(fid);
end

生成100个txt文件。如下图所示:
生成txt文件


二、eval函数的用法

本文大量地使用eval函数,这里对eval函数进行介绍。eval函数能够计算生成的字符串或数值的表达式。
eval(expression)计算字符串表达式中的MATLAB代码。 如果在匿名函数,嵌套函数或包含嵌套函数的函数中使用eval,则求值表达式无法创建变量。
使用格式是:
[output1,…,outputN] = eval(表达式)将表达式的输出存储在指定的变量中。

eval(['fid=fopen(''a',num2str(i),'.txt''',',','''a+''',');'])

两个’‘号中第一个’代表转义字符,两个’'号中第二个’号为命令中的’号,使用eval时只需要先把想要表示的语句写好,再用’号分割成一段段字符串,注意上面提到的’可以用作转义字符的情况。
示例代码如下:

eval(['1+1'])

eval函数


三、批量读取文件

1.读取子文件夹函数

代码如下:

function [SubFolders] = GetFolders(ParentFolder)
SubFolderNames = dir(ParentFolder);
for i=1:length(SubFolderNames)
        if( isequal( SubFolderNames( i ).name, '.' )||...
        isequal( SubFolderNames( i ).name, '..')||...
        ~SubFolderNames( i ).isdir) % 如果不是目录则跳过
            continue;
        end
        SubFolder(i).SubFolderName = fullfile( ParentFolder, SubFolderNames( i ).name );
end
temp = {
    
    SubFolder.SubFolderName};
idx = cellfun(@(x)~isempty(x),temp,'UniformOutput',true); % 利用cellfun函数得到元胞数组中所有非空元素的下标
SubFolders = temp(idx);
end

这个函数的功能是获取父文件夹下所有子文件夹的路径,函数的输入为ParentFolder是父文件夹路径,

例: ‘D:\Program Files’

函数的输出为SubFolders是子文件夹路径。为一个元胞数组,

例: {‘D:\Program Files\FileZilla FTP Client\docs’}

读取文件名的结果如下图所示:
读取文件名

2.一些函数的简单介绍

dir函数
示例
dir(’.’) :列出当前目录下所有子文件夹和文件
读取当前文件夹名及当前文件夹下的文件
cellfun函数
cellfun的操作对象就是cell数组,可以利用一些定义的函数对任意类
型的数据或矩阵进行计算,cellfun中可以使用自定义函数对cell数组进行处理。
调用格式为:
A = cellfun(FUN, C)
cellfun示例

3.读取文件夹下特定格式的文件名函数

代码如下:

function [FileNames] = GetFileNames(Path,Format)
fileFolder=fullfile(Path);
dirOutput=dir(fullfile(fileFolder,Format));
FileNames={
    
    dirOutput.name};
end

这个函数的功能为获得某一路径下,某种格式所有文件名
函数的输入Path是要获取的路径。

示例:
‘D:\Program Files\FileZilla FTP Client\docs’

函数的输入Format是要获取路径的文件格式。

示例:
.txt’,’.docx’,’*.png’


4.批量读取文件夹下的文件名

之前创建的文件名是“1日”,“2日”,…。这里创建cell数组存储读取到的文件名和txt文件的数据,并将读取到的每天的数据以列的形式存储到一个新的矩阵中,并对应的命名为“Q1”,“Q2”,…。

foldernames=GetFolders('D:\9月');
namelist=cell(1,length(foldernames));
for i=1:length(foldernames)
   a=foldernames{
    
    i};
   num=str2num(a(7:end-1));
   namelist{
    
    1,i}=GetFileNames(foldernames{
    
    i},'*.freq');
   P=cell(1,length(namelist{
    
    1,i}));
   for j=1:length(namelist{
    
    1,i})
       filename= namelist{
    
    i}{
    
    j};
       P{
    
    1,j} = importdata([foldernames{
    
    i},'\',filename]);
   end
   eval(['Q',num2str(num),'=[]']);
   for t=1:length(namelist{
    
    1,i})
      eval(['Q',num2str(num),'=[Q',num2str(num),',P{1,t}.data];']);
   end
end
total=[];
for i=1:length(foldernames)
    eval(['total=[total,Q',num2str(i),'];']);
end

读取刚刚创建的‘D:\9月’目录下的100个txt文件的名称,结果如下图所示:

文件名

猜你喜欢

转载自blog.csdn.net/weixin_40653652/article/details/108759707