Filter löschen
Filter löschen

Importing a CSV file as a nested cell array - is it possible

3 Ansichten (letzte 30 Tage)
AndyT
AndyT am 12 Jul. 2015
Bearbeitet: Stephen23 am 13 Jul. 2015
I'm struggling to find any online help documentation on this . Is it possible to import a csv file derived from MSExcel into Matlab directly as a nested cell array
For example if the CSV file has several rows, each with a set of values such as
23,34,1
23,44,55,72,65
4,86,98,7,12,34,9
I want to import this as a nested cell array such that the main array is of size 3 x 1 and each cell contains the data in the csv file row as nested sub arrays. So cell (1,1)of the main array has a (1x3) subarray from the first row of the CSV. Cell 2 has a (1x5) subarray from the second row and Cell 3 has a (1x7) subarray from the third row of the CSV file.
When I use the standard import data function and select 'cell array' from the options Matlab just creates one large 3x 7 array in this example and puts NaNs in the blanks.
Is it actually possible to do this or do I need to create the nested array as a separate step after importing the CSV file and how do I do that .
Many thanks

Akzeptierte Antwort

Stephen23
Stephen23 am 13 Jul. 2015
Bearbeitet: Stephen23 am 13 Jul. 2015
Here is a simple and neat solution using fileread and regexp:
out = regexp(fileread('temp.txt'),'[\n\r]+','split');
out = cellfun(@(s)sscanf(s,'%f,').', out, 'UniformOutput',false);
which we can check in the command window:
>> out{1}
ans =
23 34 1
>> out{2}
ans =
23 44 55 72 65
>> out{3}
ans =
4 86 98 7 12 34 9
The code was tested using this file:
  2 Kommentare
AndyT
AndyT am 13 Jul. 2015
Thank You Stephen , this does it and using function combinations I would never have found on my own. Much appreciated
Stephen23
Stephen23 am 13 Jul. 2015
Bearbeitet: Stephen23 am 13 Jul. 2015
My pleasure! Note that it will only work for exactly that file format that you specified in your question: as soon as space characters or letters appear in there it will probably fail :)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Azzi Abdelmalek
Azzi Abdelmalek am 12 Jul. 2015
Bearbeitet: Walter Roberson am 13 Jul. 2015
Import your data, then get ride of nan
  1 Kommentar
AndyT
AndyT am 13 Jul. 2015
Thank you Azzi, not sure I understand this . If I import and get rid of NaN ( which I do with cellfun) it doesn't create the nested cells with the data in that I require.

Melden Sie sich an, um zu kommentieren.


Walter Roberson
Walter Roberson am 12 Jul. 2015
fid = fopen('YourFile.csv', 'rt');
counter = 0;
while true
inline = fgetl(fid);
if ~ischar(inline); break; end %end of file
counter = counter + 1;
datacell{counter} = textscan(inline, '%f', 'Delimiter', ',');
end
  1 Kommentar
AndyT
AndyT am 13 Jul. 2015
Many thanks Walter, this works but seems to create 2 levels of the datacell array . The first is a 1x 1 cell and then that contains the data as another subcell e.g. datacell{1,1} is a 1x 7 cell . So the actual data is held in datacell{1,1}{1,1}.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Cell Arrays finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by