1 van 3

Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 07:11
door Wouter_Masselink
Ik heb te maken met een complexe csv file die ik in matlab wil importeren. Het probleem is echter dat hier gemeten waarden inzitten die geen integer zijn. Dat maakt de GUI van matlab (import data) waardeloos. Ik heb ook zitten neuzen in csvimport.m, echter dit laat alleen de eerste kolom zien.

Heeft iemand tips hoe ik dit het beste aan kan pakken?

hieronder een kort voorbeeld van de csv file data

Code: Selecteer alles

Speed,,,,,

 ==================== ,,,,,

Value,Unit,Category,Time,Parent,ID

7.957,um/s,Spot,5,1000000000,0

6.394,um/s,Spot,6,1000000000,1

4.022,um/s,Spot,7,1000000000,2

2.538,um/s,Spot,8,1000000000,3

1.555,um/s,Spot,9,1000000000,4

2.867,um/s,Spot,10,1000000000,5

3.554,um/s,Spot,11,1000000000,6

3.183,um/s,Spot,12,1000000000,7

2.478,um/s,Spot,13,1000000000,9
Specifiek wil ik de waarden in kolom Value vergelijken met de waarden in kolom Value uit een andere file. Deze andere file zal dezelfde format gebruiken maar zal een andere meting laten zien. Dit moet uiteindelijk allemaal samenkomen in een scatterplot.

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 07:24
door EvilBro
In Octave (Matlab is voor mietjes ;) ) leest het commando 'csvread' de file gewoon in. Waarden die geen numerieke waarde zijn worden gelijk aan 0 gesteld.

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 07:57
door Wouter_Masselink
Zelfs daar schiet matlab bij mij al de fout in

Code: Selecteer alles

csvread('test.csv')

??? Error using ==> dlmread at 145

Mismatch between file and format string.

Trouble reading number from file (row 1, field 1) ==> Speed

Error in ==> csvread at 50

m=dlmread(filename, ',', r, c);
csvimport werkt trouwens wel prima... hmmm

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 08:16
door Drieske
Dat is omdat je eerste rij niet numerisch is. Kan csvread niet mee om (in mijn ervaring). Probeer eens mfcsvread.

Meer info: http://www.mathworks.com/matlabcentral/fil...rmat-csv-reader

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 09:39
door EvilBro
Zelfs daar schiet matlab bij mij al de fout in
Eerlijkheidshalve moet ik ook toegeven dat ik als testfile een file gemaakt had van de waarden zonder de 'header'. Waarschijnlijk dat het daarom bij mij wel goed ging...

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 09:59
door Wouter_Masselink
Als uitbreiding op csvimport, het importeren van de testfile die ik hierboven heb genoemd gaat prima en alle waarden komen er prima op te staan.

csvimport op de gehele file geeft slechts de eerste rij 'Speed''''''''

mfcsvread geeft het volgende:

Code: Selecteer alles

>> mfcsvread('test.csv')

??? Error using ==> dlmread at 145

Mismatch between file and format string.

Trouble reading number from file (row 1, field 1) ==> =====

Error in ==> csvread at 50

m=dlmread(filename, ',', r, c);

Error in ==> mfcsvread at 34

fieldData=csvread(fileName,1,0);.

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 10:05
door Drieske
Hmm, en kun je die bovenste lijn niet weglaten en beginnen bij 'Value'? Dan zou mfcsvread wel moeten werken.

Edit: of wel je het niet readen en wil je een variant voor de import zoeken?

Re: Csv file importeren in matlab

Geplaatst: vr 12 aug 2011, 10:32
door DePurpereWolf
Heb je textscan al geprobeerd?

http://www.mathworks.com/help/techdoc/ref/textscan.html

Als het een rare CSV is kun je het ook gewoon benaderen als een 'text' document. Textscan heeft vele opties.

Re: Csv file importeren in matlab

Geplaatst: ma 15 aug 2011, 08:16
door Wouter_Masselink
Wat is concreet het verschil tussen lezen en importeren? Zo lang ik m'n data kan bewerken is het prima en maakt het me niet zo veel uit wat er gebruikt wordt.

Om textscan te kunnen uitvoeren dien ik het eert fopen te gebruiken

Code: Selecteer alles

>>fopen('test.csv')

ans =

 3
Vervolgens kan ik uit de tekst op mathworks opmaken dat het importeren van de file dus is gelukt (jeuj)
When fopen successfully opens a file, it returns a file identifier greater than or equal to 3
Vervolgens dien ik de test.csv file in relevante blokken in te delen. Ten eerste heb ik te maken met de titel (Speed) en met de headers, ten slotte ook nog de daadwerkelijke data.

Deze probeer ik als volgt te openen:

Code: Selecteer alles

 %Specify file to open

fopen ('/Users/wmasseli/Desktop/test.csv')

%Read title

C_title = textscan ('fid', '%s', 'Delimiter', ',')

%Read headers, skip 2 headerLines

C_headers = textscan ('fid', '%s %s %s %s %s %s', 'Delimiter', ',','headerLines','2')

%Read data.

C_data = textscan ('fid', '%f %s %s %d %d %d', 'Delimiter',',')
Met de output:

Code: Selecteer alles

ans =

 9

C_title = 

{1x1 cell}

C_headers = 

{0x1 cell}	{0x1 cell}	{0x1 cell}	{0x1 cell}	{0x1 cell}	{0x1 cell}

C_data = 

[0x1 double]	{0x1 cell}	{0x1 cell}	[0x1 int32]	[0x1 int32]	[0x1 int32]
De titel lijkt goed te worden geladen (1x1 cell). De rest van de headers en de daadwerkelijke data echter niet. Heeft iemand enig idee of ik iets verkeerd doe met de delimiters, headerlines, specifiers of met nog iets totaal anders?

Re: Csv file importeren in matlab

Geplaatst: ma 15 aug 2011, 09:09
door Bart

Code: Selecteer alles

fid = fopen('/Users/wmasseli/Desktop/test.csv



% Read 3 header lines

Headers = textscan(fid, repmat('%s', 1, 6), 3, 'Delimiter', ',');



% Read body

Data = textscan (fid, '%f%s%s%d%d%d', 'Delimiter', ',');

Re: Csv file importeren in matlab

Geplaatst: ma 15 aug 2011, 09:41
door Wouter_Masselink
Dank je Bart, dit lijkt te werken. Ook de daadwerkelijke files die ik moet verwerken (zelfde opmaak, alleen veel langer) worden volledig gelezen. Dat hebben we gelukkig gehad. Ik ga nu eens rustig kijken hoe ik uit twee van dergelijke files een specifieke cellen kan lezen om er scatterplots van te maken. Daar kom ik vast nog wel op terug.

Re: Csv file importeren in matlab

Geplaatst: ma 15 aug 2011, 15:39
door Raga
Misschien mosterd na de maaltijd, maar ik gebruik zelf de functie csv2cell die je kunt vinden op de fileexchange van mathworks (csv2cell).

Re: Csv file importeren in matlab

Geplaatst: ma 15 aug 2011, 16:23
door Bart
Misschien mosterd na de maaltijd, maar ik gebruik zelf de functie csv2cell die je kunt vinden op de fileexchange van mathworks (csv2cell).
Is een mooi voorbeeld zoals je een Matlab functie niet moet schrijven.

Re: Csv file importeren in matlab

Geplaatst: di 16 aug 2011, 10:59
door Wouter_Masselink
Ik heb nog wat met die code zitten spelen en weet 'm nu ook op andere files (met iets andere lay-out) toe te passen.

Het komt er op neer dat ik een scatterplot heb gemaakt gebaseerd op twee kolommen die uit twee verschillende csv files zijn getrokken.

Nu heb ik een heel batterij aan variabelen met elkaar te vergelijken. Daarvoor zou ik graag in deze plot elk punt een unieke identificatie geven. Let wel dit zou een identificatie moeten zijn die consistent dezelfde nummering toepast. Rij 5 in file X refereert aan hetzelfde object als Rij 5 in file Y.

Het liefst zou ik dus bijvoorbeeld een nummering bij/op elk punt hebben staan. Heeft iemand enig idee of dit mogelijk is en zo ja, hoe?

De code zoals ik 'm nu heb ziet er als volgt uit:

Code: Selecteer alles

%Specify file to open. Data will be displayed on X axis

fid = fopen('/file.csv');

% Read 3 header lines

Headers1 = textscan(fid, repmat('%s', 1, 4), 3, 'Delimiter', ',');

% Read body

Data1 = textscan (fid, '%f%s%s%d', 'Delimiter', ',');

%Close file

fid = fclose(fid);

%Specify file to open. Data will be displayed on Y axis

fid = fopen('/file2.csv');

% Read 3 header lines

Headers2 = textscan(fid, repmat('%s', 1, 4), 3, 'Delimiter', ',');

% Read body

Data2 = textscan (fid, '%f%s%s%d', 'Delimiter', ',');

%Close file

fid = fclose(fid);

%Create graphs

figure

X = Data1 {:,1};

Y = Data2 {:,1};

plot (X,Y,'o')

%define axis range

axis ([0,250,0,1])

% Create xlabel

xlabel({'Total track length (um)'},'FontSize',16);

% Create ylabel

ylabel('Straightness','FontSize',16);

% Create title

title({'Overview of cell migratory behaviour'},'FontSize',20);
Ik heb hiervoor al rond zitten neuzen maar heb niet eens een duidelijk idee welke search query ik hiervoor zou moeten gebruiken.

Re: Csv file importeren in matlab

Geplaatst: di 16 aug 2011, 19:40
door Bart
Je zou het volgende kunnen doen

Code: Selecteer alles

%Create graphs

for k = 1 : size(Data1, 2)

  fh(k) = figure();

  X = Data1{:, k};

  Y = Data2{:, k};

  scatter(X, Y);

  axis ([0,250,0,1])

  xlabel({'Total track length (um)'},'FontSize',16);

  ylabel('Straightness','FontSize',16);

  title({'Overview of cell migratory behaviour'},'FontSize',20);

end