John
John

Reputation: 475

Read data from file into arrays matlab

I was not sure which title fits better in my case so I just left it to be written in the most general way. I have the file with following structure:

Step 1
0.10190103    
0.10145140    
0.10097524    
0.10050153    
0.10003042    
9.95795131E-02
9.91610140E-02
Step 2
9.81189385E-02
9.75561813E-02
9.80424136E-02
0.10000000    
0.10000000    
9.80617628E-02
9.77829769E-02
...
Step N
0.10000000    
0.10000000    
9.93788019E-02
0.11977901    
0.12290157    
0.12588248    
0.12861508

And I need to read it from N arrays, so

V1 = [0.10190103    
0.10145140    
0.10097524    
0.10050153    
0.10003042    
9.95795131E-02
9.91610140E-02]

V2 = [9.81189385E-02
9.75561813E-02
9.80424136E-02
0.10000000    
0.10000000    
9.80617628E-02
9.77829769E-02]

VN = [0.10000000    
0.10000000    
9.93788019E-02
0.11977901    
0.12290157    
0.12588248    
0.12861508]

I have read some examples to read data into arrays, but have not got something related to my case...

Can someone help me please..?

My Try

d = readtable('whole res.txt'); % name of file 
d = table2cell(d);  
d = regexprep(d,' ','');
d = cellfun(@str2double,d,'uni',0);
d(cellfun(@isnan,d)) = [];
d = reshape(cell2mat(d),12,[]); % 12 - is values number

But still does not work. Traceback:

Error using readtable (line 143)
Reading failed at line 2. All lines of a text file must have the same number of delimiters. Line 2 has 4
delimiters, while preceding lines have 1.

SAMPLE FILE

Step 1
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10000001    
0.10000001    
0.10000001    
0.10000000    
0.10000001    
0.10000001    
0.10000001    
Step 2
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10034978    
0.10070127    
0.10070127    
0.10000000    
0.10000001    
0.10000001    
0.10000001 

PrintScreen

enter image description here

Upvotes: 0

Views: 166

Answers (1)

Tasos Papastylianou
Tasos Papastylianou

Reputation: 22215

Assuming data has STRICT format, i.e.:
- a line is either a "Step line" or a number
- a "Step line" is necessarily of the format "Step N" where N is an integer
- as many numbers per step can appear

Then here's a solution. Feel free to study it and adapt to your needs.

function Out = readData (In)
  C = strsplit (fileread (In));
  Out = cell(1,1); AtStepcount = false; CurrIndex = 0;

  for I = 1 : length (C)
    if strcmp (C{I}, 'Step'); AtStepcount = true; continue; end
    if AtStepcount
      CurrIndex = str2double(C{I}); Out{CurrIndex} = []; AtStepcount = false; 
      continue
    end
    Out{CurrIndex} = [Out{CurrIndex}; str2double(C{I})];
  end
end

Usage:

V = readData ('myDataFile');

Note: this returns a single cell array, with the step numbers used as indices for each cell element created. This is how you should be doing it anyway; it's generally a bad idea to have variables named "V1", "V2" etc, since you can't iterate using this. With the above solution, your arrays are stored as V{1}, V{2}, etc, and V itself can be used in a for loop.

Upvotes: 1

Related Questions