我创建了一个.dat文件名文件。我想在MATLAB中读入该列表中的每个文件,并为数据指定一个不同的名称。目前,每次迭代都会覆盖最后一次。
我发现很多人都给出了这个答案:
for i=1:10
A{i} = 1:i;
end
然而,它不适用于我的问题。这就是我正在做的事情
flist = fopen('fnames.dat'); % Open the list of file names
nt = 0; % Counter will go up one for each file loaded
while ~feof(flist) % While end of file has not been reached
for i = 1:6 % Number of filenames in the .dat file
% For each file
fname = fgetl(flist); % Reads next line of list, which is the name of the next data file
disp(fname); % Stores name as string in fname
nt = nt+1; % Time index
% Save data
data{i} = read_mixed_csv(fname, '\t'); % Reads in the CSV file% Open file
data{i} = data(2:end,:); % Replace header row
end
end
代码运行时没有错误,但只保存了一个data
变量。
我的fnames.dat包含: IA_2007_MDA8_O3.csv IN_2007_MDA8_O3.csv MI_2007_MDA8_O3.csv MN_2007_MDA8_O3.csv OH_2007_MDA8_O3.csv WI_2007_MDA8_O3.csv
如果可能的话,我真的想将data
命名为更直观。与第一个文件的IA
类似,第二个文件的IN
类似,依此类推。有没有办法做到这一点?
答案 0 :(得分:2)
循环的最后一行是问题:
data{i} = data(2:end,:);
我不知道究竟发生了什么,我没有运行你的代码,但data(2:end,:)
指的是倒数第二个数据集,而不是倒数第二行。
尝试:
thisdata = read_mixed_csv(fname, '\t');
data{i} = thisdata(2:end,:);
答案 1 :(得分:1)
如果要跟踪哪个数据来自哪个文件,请保存另一个名称为
的单元格数组。thisdata = read_mixed_csv(fname, '\t');
data{i} = thisdata(2:end,:);
names{i} = fname(1:2); % presuming you only need first two letters.
如果您需要文件名的特定部分并不总是相同的长度,请查看strtok
或fileparts
。然后,您可以使用strcmp
之类的内容检查单元格数组names
,以查找标记为IA
的数据或存储的数据。
答案 2 :(得分:0)
正如@Daniel所提到的,在单元格数组中存储各种大小数据的简单方法。
data {1} = thisdata(2:end,:)
但是,如果名称非常重要,您可以考虑使用结构。例如:
dataStruct(1).numbers= thisdata(2:end,:);
dataStruct(1).name= theRelevantName
当然你也可以将它们添加到单元格数组中:
dataCell{1,1} = thisdata(2:end,:);
dataCell{1,2} = theRelevantName