根据导入的文件名

时间:2017-12-01 09:05:14

标签: matlab variables rename

我使用

从本地目录导入一些以下列字符和文件扩展名结尾的文件
files = dir('*_eta.txt');
for file = files'
    load(file.name)
end

产生预期结果,将文件加载到工作区中。

我现在希望通过将第二列拆分为另一个变量来转换这一个变量(包含两列,3003行)。

我已经有了执行此转换的代码,但是我想在文件名后面命名新变量,这次省略了' _eta'。 我尝试在extractBefore(file.name,'_eta')循环中使用who('*_eta'),但发现我无法生成我之后的结果。

我很欣赏MATLAB(或任何编程语言)中不建议使用动态变量名称 - 但我很惊讶我为了访问变量而挣扎太多,减少变量名称和执行一项功能。

此外,我希望将它们保留为数组,而不是将它们组合成单元格或结构。

感谢任何帮助!

编辑:动机 - 这就是我目前正在做的事情:

t = (0:0.01:10);

load('MPConst_eta.txt'); load('MVConst_eta.txt');
load('KVPConst_eta.txt'); load('KVVConst_eta.txt');
load('SLSPConst_eta.txt'); load('SLSVConst_eta.txt');
load('MPRamp_eta.txt'); load('MVRamp_eta.txt');
load('KVPRamp_eta.txt'); load('KVVRamp_eta.txt');
load('SLSPRamp_eta.txt'); load('SLSVRamp_eta.txt');

for k = 1:3
    MP_Const(:,k) = MPConst_eta((k-1)*length(t)+1:k*length(t),2);
    MV_Const(:,k) = MVConst_eta((k-1)*length(t)+1:k*length(t),2);
    KVP_Const(:,k) = KVPConst_eta((k-1)*length(t)+1:k*length(t),2);
    KVV_Const(:,k) = KVVConst_eta((k-1)*length(t)+1:k*length(t),2);
    SLSP_Const(:,k) = SLSPConst_eta((k-1)*length(t)+1:k*length(t),2);
    SLSV_Const(:,k) = SLSVConst_eta((k-1)*length(t)+1:k*length(t),2);
    MP_Ramp(:,k) = MPRamp_eta((k-1)*length(t)+1:k*length(t),2);
    MV_Ramp(:,k) = MVRamp_eta((k-1)*length(t)+1:k*length(t),2);
    KVP_Ramp(:,k) = KVPRamp_eta((k-1)*length(t)+1:k*length(t),2);
    KVV_Ramp(:,k) = KVVRamp_eta((k-1)*length(t)+1:k*length(t),2);
    SLSP_Ramp(:,k) = SLSPRamp_eta((k-1)*length(t)+1:k*length(t),2);
    SLSV_Ramp(:,k) = SLSVRamp_eta((k-1)*length(t)+1:k*length(t),2);
end

正如您所看到的,对于不同的文件,相同的操作会有很多重复 - 并且会有很多,所以想尝试以聪明的方式进行操作。

1 个答案:

答案 0 :(得分:3)

尝试

A = load(file.name);
varname = file.name(1:end-8); % remove _eta.txt
eval([varname,'=A(:,2)']) % save the second column in the variable with name 'varname'

它很慢而且不是很优雅,但它会起作用。

编辑:您可以使用结构并将每个文件保存在一个字段中:

files = dir('*_eta.txt');
all_data = struct;
for i = 1:numel(files)
  filename = files(i).name;
  dummy = load(filename)
  fieldname = filename(1:end-8); % remove _eta.txt
  for i = 1:3
    % Use the file name to create a field of the structure and save your things in the kth column
    all_data.(fieldname)(:,k) = dummy((k-1)*length(t)+1:k*length(t),2);
  end
end

当然,预先分配东西会让事情变得更快