Octave:加载特定目录中的所有文件

时间:2014-07-07 17:49:13

标签: matlab matrix load octave dir

我曾经使用Matlab并从目录中加载了所有txt文件" C:\ folder \"使用以下代码进入Matlab:

myFolder = 'C:\folder\';
filepattern = fullfile(myFolder, '*.txt');
files = dir(filepattern);
for i=1:length(files)
eval(['load ' myFolder,files(i).name ' -ascii']);
end

如果C:\ folder \包含A.txt,B.txt,C.txt,那么我将在工作区中包含矩阵A,B和C.

代码在八度音程中不起作用,可能是因为" fullfile"?无论如何,使用以下代码我得到名称为C__folder_A,C__folder_B,C__folder_C的矩阵。但是,我需要一个名为A,B,C的矩阵。

myFolder = 'C:\folder\';
files = dir(myFolder);
for i=3:length(files)
eval(['load ' myFolder,files(i).name ' -ascii']);
end
你能帮帮我吗? 谢谢, 马丁

PS:循环以3开头,因为files(1).name =。和文件(2).name = ..

编辑: 我刚刚找到了解决方案。它不优雅,但它有效。 我只需添加文件所在的路径" addpath",然后我就不必在循环中提供目录的全名。

myFolder = 'C:\folder\';
addpath(myFolder)
files = dir(myFolder);
for i=3:length(files)
eval(['load ' files(i).name ' -ascii']);
end

2 个答案:

答案 0 :(得分:3)

如果您将文件加载到动态生成名称的变量,并且您应该将它们加载到单元格数组中,这通常是糟糕的设计,但这应该有效:

files = glob('C:\folder\*.txt')
for i=1:numel(files)
  [~, name] = fileparts (files{i});
  eval(sprintf('%s = load("%s", "-ascii");', name, files{i}));
endfor

答案 1 :(得分:0)

函数scanFiles在当前目录(extensions)和子目录中以initialPath递归来搜索文件名。参数fileHandler是可用于处理填充的文件结构(即读取文本,加载图像等)的功能

来源

function scanFiles(initialPath, extensions, fileHandler)
  persistent total = 0;
  persistent depth = 0; depth++;
  initialDir = dir(initialPath);

  printf('Scanning the directory %s ...\n', initialPath);

  for idx = 1 : length(initialDir) 
    curDir = initialDir(idx);
    curPath = strcat(curDir.folder, '\', curDir.name);

    if regexp(curDir.name, "(?!(\\.\\.?)).*") * curDir.isdir
      scanFiles(curPath, extensions, fileHandler);
    elseif regexp(curDir.name, cstrcat("\\.(?i:)(?:", extensions, ")$"))
      total++;
      file = struct("name",curDir.name,
                     "path",curPath,
                     "parent",regexp(curDir.folder,'[^\\\/]*$','match'),
                     "bytes",curDir.bytes);
      fileHandler(file);
    endif
  end

  if!(--depth)
    printf('Total number of files:%d\n', total);
    total=0;
  endif
endfunction

用法

# txt
# textFileHandlerFunc=@(file)fprintf('%s',fileread(file.path));
# scanFiles("E:\\Examples\\project\\", "txt", textFileHandlerFunc);

# images
# imageFileHandlerFunc=@(file)imread(file.path);
# scanFiles("E:\\Examples\\project\\datasets\\", "jpg|png", imageFileHandlerFunc);

# list files
fileHandlerFunc=@(file)fprintf('path=%s\nname=%s\nsize=%d bytes\nparent=%s\n\n',
               file.path,file.name,file.bytes,file.parent);
scanFiles("E:\\Examples\\project\\", "txt", fileHandlerFunc);