最近用Matlab处理文本遇到一个很棘手的问题。
问题:用Matlab实现某一个文件夹下所有子文件夹名的读取,然后通过for循环,把子文件夹名和父级目录合并,形成一个完整的路径,再利用fopen打开这个子文件夹,对子文件夹下的所有文件进行读写操作。
想法:用dir函数实现文件夹名的读取,再通过sprintf实现路径的合并。
困难:dir函数得到的是结构体数组,但是父级目录需要通过元胞数组进行复制,这两种数组转换的原理并不是很清晰,或者说是否有更简单直接的方法,还请不吝赐教,谢谢。
matlab
% 设置父级目录
parent_dir = 'C:\example\';% 获取所有子文件夹名
sub_dirs = dir(parent_dir);
sub_dirs = sub_dirs([sub_dirs.isdir]); % 只保留文件夹
sub_dirs = sub_dirs(3:end); % 去除 . 和 ..% 遍历所有子文件夹
for i = 1:length(sub_dirs)
% 获取子文件夹名
sub_dir_name = sub_dirs(i).name;
% 合并路径
sub_dir_path = sprintf('%s%s\\', parent_dir, sub_dir_name);
% 打开子文件夹
sub_dir = dir(sub_dir_path);
% 遍历子文件夹下的所有文件
for j = 1:length(sub_dir)
% 获取文件名
file_name = sub_dir(j).name;
% 排除 . 和 ..
if strcmp(file_name, '.') || strcmp(file_name, '..')
continue;
end
% 合并路径
file_path = sprintf('%s%s', sub_dir_path, file_name);
% 打开文件
fid = fopen(file_path, 'r');
% 读写操作
% ...
% 关闭文件
fclose(fid);
end
end
这段代码首先设置了父级目录,然后使用dir函数获取所有子文件夹名,并遍历所有子文件夹。在遍历每个子文件夹时,使用sprintf函数将子文件夹名和父级目录合并成完整路径,并使用dir函数获取子文件夹下的所有文件。在遍历每个文件时,使用sprintf函数将文件名和子文件夹路径合并成完整路径,并使用fopen函数打开文件进行读写操作。最后使用fclose函数关闭文件。
可以使用dir函数获取当前文件夹下的所有子文件夹,然后利用for循环遍历每个子文件夹,将其与父级目录合并成完整路径,最后再利用fopen函数对子文件夹下的所有文件进行读写操作。
具体实现代码如下:
% 获取当前文件夹下的所有子文件夹
subfolders = dir('*/');
% 遍历每个子文件夹进行操作
for i = 1:length(subfolders)
% 将子文件夹名与父级目录合并成完整路径
folder_path = fullfile(subfolders(i).folder, subfolders(i).name);
% 打开子文件夹
folder = fopen(folder_path);
% 对子文件夹下的所有文件进行读写操作,例如:
files = dir(fullfile(folder_path, '*.txt'));
for j = 1:length(files)
file_path = fullfile(files(j).folder, files(j).name);
% 读取文件内容
content = fileread(file_path);
% 写入文件内容
fwrite(folder, content);
end
% 关闭子文件夹
fclose(folder);
end
其中,fullfile函数可以将多个字符串合并成一个完整路径,dir函数返回的结构体数组中,folder字段表示文件夹所在的父级目录,name字段表示文件夹名。而元胞数组可以通过{}操作符访问其中的元素,将其转换为字符串类型。
可以使用dir函数获取文件夹下的所有文件和文件夹的信息,然后通过判断是否为文件夹来获取子文件夹的路径。具体代码如下:
parent_folder = 'path/to/parent/folder'; % 父级目录
files = dir(parent_folder); % 获取父级目录下所有文件和文件夹的信息
for i = 1:length(files)
file_name = files(i).name;
if strcmp(file_name, '.') || strcmp(file_name, '..') % 排除当前目录和上级目录
continue;
end
file_path = fullfile(parent_folder, file_name); % 当前文件或文件夹的完整路径
if files(i).isdir % 如果是文件夹
sub_folder = file_path; % 子文件夹路径
% 对子文件夹下的所有文件进行读写操作
sub_files = dir(sub_folder);
for j = 1:length(sub_files)
sub_file_name = sub_files(j).name;
if strcmp(sub_file_name, '.') || strcmp(sub_file_name, '..') % 排除当前目录和上级目录
continue;
end
sub_file_path = fullfile(sub_folder, sub_file_name); % 当前文件的完整路径
% 读写操作
end
else % 如果是文件
% 读写操作
end
end
其中,fullfile函数可以将两个路径组合成一个完整的路径,避免了手动添加斜杠或反斜杠的问题。isdir字段可以判断当前文件或文件夹是否是文件夹。