SugaKookie
SugaKookie

Reputation: 790

Name each variable differently in a loop

I have created a .dat file of file names. I want to read into MATLAB each file in that list and give the data a different name. Currently, each iteration just overwrites the last one.

I found that a lot of people give this answer:

for i=1:10
  A{i} = 1:i;
end

However, it isn't working for my problem. Here's what I am doing

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

The code runs with no errors, but only one data variable is saved.

My fnames.dat contains this: 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

If possible, I would really like to name data something more intuitive. Like IA for the first file, IN for the second and so on. Is there any way to do this?

Upvotes: 0

Views: 253

Answers (3)

Dennis Jaheruddin
Dennis Jaheruddin

Reputation: 21563

As mentioned by @Daniel the simple way to store data of various sizes in a cell array.

data{1} = thisdata(2:end,:)

However, if the names are really important, you could consider using a struct instead. For example:

dataStruct(1).numbers= thisdata(2:end,:);
dataStruct(1).name= theRelevantName

Of course you could also just add them to the cell array:

dataCell{1,1} = thisdata(2:end,:);
dataCell{1,2} = theRelevantName

Upvotes: 0

nkjt
nkjt

Reputation: 7817

If you want to keep track of what data came from which file, save out a second cell array with the names:

thisdata = read_mixed_csv(fname, '\t');
data{i} = thisdata(2:end,:);
names{i} = fname(1:2); % presuming you only need first two letters.

If you need a specific part of the filename that's not always the same length look into strtok or fileparts. Then you can use things like strcmp to check the cell array names for where the data labelled IA or whichever is stored.

Upvotes: 1

Daniel
Daniel

Reputation: 36710

The last line of the loop is the problem:

data{i} = data(2:end,:);

I don't know what exactly happens I did not run your code, but data(2:end,:) refers to the second to last dataset, not the second to last line.

Try:

thisdata = read_mixed_csv(fname, '\t');
data{i} = thisdata(2:end,:);

Upvotes: 2

Related Questions