一、介绍
我们在研究一些课题时,经常会遇到大量的数据需要处理,在存在大量数据文件的时候,需要批量读取文件中的数据,将其转换为矩阵进行计算。
目前笔者要处理的数据是一个项目一个月的数据,如下图所示:
这里先创建一个在“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文件。如下图所示:
二、eval函数的用法
本文大量地使用eval函数,这里对eval函数进行介绍。eval函数能够计算生成的字符串或数值的表达式。
eval(expression)计算字符串表达式中的MATLAB代码。 如果在匿名函数,嵌套函数或包含嵌套函数的函数中使用eval,则求值表达式无法创建变量。
使用格式是:
[output1,…,outputN] = eval(表达式)将表达式的输出存储在指定的变量中。
eval(['fid=fopen(''a',num2str(i),'.txt''',',','''a+''',');'])
两个’‘号中第一个’代表转义字符,两个’'号中第二个’号为命令中的’号,使用eval时只需要先把想要表示的语句写好,再用’号分割成一段段字符串,注意上面提到的’可以用作转义字符的情况。
示例代码如下:
eval(['1+1'])
三、批量读取文件
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)
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文件的名称,结果如下图所示: