Springen naar inhoud

Csv file importeren in matlab


  • Log in om te kunnen reageren

#1

Wouter_Masselink

    Wouter_Masselink


  • >5k berichten
  • 8246 berichten
  • VIP

Geplaatst op 12 augustus 2011 - 06:11

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
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

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 12 augustus 2011 - 06:24

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.

#3

Wouter_Masselink

    Wouter_Masselink


  • >5k berichten
  • 8246 berichten
  • VIP

Geplaatst op 12 augustus 2011 - 06:57

Zelfs daar schiet matlab bij mij al de fout in

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

#4

Drieske

    Drieske


  • >5k berichten
  • 10217 berichten
  • Moderator

Geplaatst op 12 augustus 2011 - 07:16

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...rmat-csv-reader
Zoek je graag naar het meest interessante wetenschapsnieuws? Wij zoeken nog een vrijwilliger voor ons nieuwspostteam.

#5

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 12 augustus 2011 - 08:39

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...

#6

Wouter_Masselink

    Wouter_Masselink


  • >5k berichten
  • 8246 berichten
  • VIP

Geplaatst op 12 augustus 2011 - 08:59

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:

>> 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

#7

Drieske

    Drieske


  • >5k berichten
  • 10217 berichten
  • Moderator

Geplaatst op 12 augustus 2011 - 09:05

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.

#8

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 12 augustus 2011 - 09:32

Heb je textscan al geprobeerd?
http://www.mathworks...f/textscan.html

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

#9

Wouter_Masselink

    Wouter_Masselink


  • >5k berichten
  • 8246 berichten
  • VIP

Geplaatst op 15 augustus 2011 - 07:16

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

>>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:
%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:
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

#10

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 15 augustus 2011 - 08:09

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

#11

Wouter_Masselink

    Wouter_Masselink


  • >5k berichten
  • 8246 berichten
  • VIP

Geplaatst op 15 augustus 2011 - 08:41

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

#12

Raga

    Raga


  • >25 berichten
  • 99 berichten
  • Lorentziaan

Geplaatst op 15 augustus 2011 - 14:39

Misschien mosterd na de maaltijd, maar ik gebruik zelf de functie csv2cell die je kunt vinden op de fileexchange van mathworks (csv2cell).
Raga

#13

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 15 augustus 2011 - 15:23

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

#14

Wouter_Masselink

    Wouter_Masselink


  • >5k berichten
  • 8246 berichten
  • VIP

Geplaatst op 16 augustus 2011 - 09:59

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:
%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

#15

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 16 augustus 2011 - 18:40

Je zou het volgende kunnen doen

%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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures