【问题标题】:Matlab save table with different file names in different filesMatlab在不同文件中保存不同文件名的表
【发布时间】:2019-11-13 18:45:40
【问题描述】:

我正在尝试使用 datastorereadtable 读取不同的文件 (txt),以便解析它们并将它们写入 .mat 文件。 我正在使用ds = datastore('*.txt').Files 来获取目录中的所有文件名,然后使用 for 循环遍历所有不同的文件并使用不同的名称保存它们。 但是,当我在 matlab 中导入文件时,它们具有所有相同的表名 (dat)。

代码如下:

ds = datastore('*.txt');
fnames = ds.Files;
l = length(fnames);

for i = 1:l
  dat = readtable(fnames{i}, 'Delimiter', '\t');
  dat.Properties.VariableNames(1:2) = {'rpm', 'p_coll'};
  dat = removevars(dat{i},20:width(dat));
  save([fnames{i} '.mat'],'dat');
end

我尝试使用 dat 数组,但没有成功。有什么想法吗?

【问题讨论】:

  • 为什么要不同的表名?你会得到什么额外的好处?如果有 100 个文件,你想要 100 个不同的表变量?那将是一件非常糟糕的事情。

标签: matlab file variables


【解决方案1】:

正如 Sardar 所说,将数据存储在 L 不同的变量中是没有意义的。如果您必须这样做,那么您的程序设计中可能存在更大的问题。你最好描述一下你为什么需要它。

作为替代方案,您可以将这些文件加载​​到单个元胞数组中:

L = 10;
for ii =1:L
   dat = 2*ii;
   fn = sprintf('dat%d.mat', ii);
   save(fn, 'dat');
end

dats = cell(L, 1);
for ii=1:L
    fn = sprintf('dat%d.mat', ii);
    load(fn);
    dats{ii} = dat;
end

另一种选择是将它们放在一个结构中:

dats = struct();
for ii=1:L
    fn = sprintf('dat%d.mat', ii);
    load(fn);
    dats.(sprintf('dat%d', ii)) = dat;
end

与元胞数组相比,我认为这种方法没有任何优势,但它有点有趣。

最后,如果你真的有理由将数据存储在多个变量中,你可以使用eval

for ii =1:L
   dat = ii^2;
   eval(sprintf('dat%d=dat;', ii));
   fn = sprintf('dat%d.mat', ii);
   save(fn, sprintf('dat%d', ii));
end

for ii=1:L
    fn = sprintf('dat%d.mat', ii);
    load(fn);
end

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2013-06-21
    相关资源
    最近更新 更多