Gebruikersavatar
Wouter_Masselink
Artikelen: 0
Berichten: 8.560
Lid geworden op: ma 13 okt 2003, 09:54

Csv file importeren in matlab

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.
"Meep meep meep." Beaker
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Csv file importeren in matlab

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.
Gebruikersavatar
Wouter_Masselink
Artikelen: 0
Berichten: 8.560
Lid geworden op: ma 13 okt 2003, 09:54

Re: Csv file importeren in matlab

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
"Meep meep meep." Beaker
Gebruikersavatar
Drieske
Artikelen: 0
Berichten: 10.179
Lid geworden op: za 12 jul 2008, 17:07

Re: Csv file importeren in matlab

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
Zoek je graag naar het meest interessante wetenschapsnieuws? Wij zoeken nog een vrijwilliger voor ons nieuwspostteam.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Csv file importeren in matlab

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...
Gebruikersavatar
Wouter_Masselink
Artikelen: 0
Berichten: 8.560
Lid geworden op: ma 13 okt 2003, 09:54

Re: Csv file importeren in matlab

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);.
"Meep meep meep." Beaker
Gebruikersavatar
Drieske
Artikelen: 0
Berichten: 10.179
Lid geworden op: za 12 jul 2008, 17:07

Re: Csv file importeren in matlab

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?
Zoek je graag naar het meest interessante wetenschapsnieuws? Wij zoeken nog een vrijwilliger voor ons nieuwspostteam.
Gebruikersavatar
DePurpereWolf
Artikelen: 0
Berichten: 9.240
Lid geworden op: wo 12 mar 2003, 19:44

Re: Csv file importeren in matlab

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.
Gebruikersavatar
Wouter_Masselink
Artikelen: 0
Berichten: 8.560
Lid geworden op: ma 13 okt 2003, 09:54

Re: Csv file importeren in matlab

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?
"Meep meep meep." Beaker
Gebruikersavatar
Bart
Artikelen: 0
Berichten: 7.224
Lid geworden op: wo 06 okt 2004, 22:42

Re: Csv file importeren in matlab

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', ',');
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton
Gebruikersavatar
Wouter_Masselink
Artikelen: 0
Berichten: 8.560
Lid geworden op: ma 13 okt 2003, 09:54

Re: Csv file importeren in matlab

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.
"Meep meep meep." Beaker
Gebruikersavatar
Raga
Lorentziaan
Artikelen: 0
Berichten: 99
Lid geworden op: wo 30 jan 2008, 14:31

Re: Csv file importeren in matlab

Misschien mosterd na de maaltijd, maar ik gebruik zelf de functie csv2cell die je kunt vinden op de fileexchange van mathworks (csv2cell).
Raga
Gebruikersavatar
Bart
Artikelen: 0
Berichten: 7.224
Lid geworden op: wo 06 okt 2004, 22:42

Re: Csv file importeren in matlab

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.
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton
Gebruikersavatar
Wouter_Masselink
Artikelen: 0
Berichten: 8.560
Lid geworden op: ma 13 okt 2003, 09:54

Re: Csv file importeren in matlab

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.
"Meep meep meep." Beaker
Gebruikersavatar
Bart
Artikelen: 0
Berichten: 7.224
Lid geworden op: wo 06 okt 2004, 22:42

Re: Csv file importeren in matlab

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
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

Terug naar “Informatica en programmeren”