1

I have some .csv files in a directory and I would like to create a cell array in which every cell is a cell array containing the data of one .csv file.

For example, one of my .csv files named example.csv could be like this:

126; 1; d; 0.0238343
10; 1; d; 8.05893e-08
48; 1; d; 0.000204261
8; 1; d; 3.02726e-08
20; 1; d; 2.17914e-07
41; 1; d; 0.000179662
75; 1; d; 0.00204058
0; 1; d; 2.98228e-17
81; 1; d; 0.00241941
17; 1; d; 4.04806e-06
128; 1; d; 0.0141687

The first two columns always contain integers (the second one can have only 1 or 0), the third contains always a single character (it can be either d or p) and the fourth contains only floating point numbers.

Right now this is what I do for a single file:

file = fopen('example.csv');
csv_file = textscan(file, '%s%s%s%s', 'delimiter', ';', 'CollectOutput', true);
fclose(file);
csv_file = csv_file{1};
csv_file(:,1) = num2cell( str2double(csv_file(:,1)) );
csv_file(:,2) = num2cell( str2double(csv_file(:,2)) );
csv_file(:,4) = num2cell( str2double(csv_file(:,4)) );

at the end the variable csv_file contains a cell array like this:

[126]    [1]    'd'    [    0.0238]
[ 10]    [1]    'd'    [8.0589e-08]
[ 48]    [1]    'd'    [2.0426e-04]
[  8]    [1]    'd'    [3.0273e-08]
[ 20]    [1]    'd'    [2.1791e-07]
[ 41]    [1]    'd'    [1.7966e-04]
[ 75]    [1]    'd'    [    0.0020]
[  0]    [1]    'd'    [2.9823e-17]
[ 81]    [1]    'd'    [    0.0024]
[ 17]    [1]    'd'    [4.0481e-06]
[128]    [1]    'd'    [    0.0142]

How can i do this for every .csv file in my directory in such a way that in the end I end up with a single variable containing all the cell arrays?

I need this so then I can work on all the cell arrays as I want, without the need to extract them into a variable all the time.

4
  • 1
    Use dir to output a list of files and loop through them. Commented Aug 3, 2017 at 18:33
  • I did that, but csv_file will be overwritten every time Commented Aug 3, 2017 at 18:49
  • @SardarUsama I'm sorry I don't understand. Could you make an example? Commented Aug 3, 2017 at 19:00
  • 1
    put this in your loop (assuming loop counter "i"): all_files{i} = csv_file; Commented Aug 3, 2017 at 19:06

1 Answer 1

1

This is what suggested to you in the comments:

filename=dir;             %attributes
filename={filename.name}; %Extracting filenames
len=length(filename);     %Number of files
files = cell(1,len );     %Pre-allocation
for m=1:len
    file = fopen(filename{k});
    csv_file = textscan(file, '%s%s%s%s', 'delimiter', ';', 'CollectOutput', true);
    fclose(file);

    %Your array manipulations
    csv_file = csv_file{1};
    csv_file(:,1) = num2cell( str2double(csv_file(:,1)) );
    csv_file(:,2) = num2cell( str2double(csv_file(:,2)) );
    csv_file(:,4) = num2cell( str2double(csv_file(:,4)) );

    files{m}= csv_file;   %Saving result of each iteration in an index of a cell array  
end
Sign up to request clarification or add additional context in comments.

1 Comment

Now I understand. Thank you very much!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.