WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Einlesen einer komplizierten csv Datei

 

Sebastianvsmatlab
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2015, 12:33     Titel: Einlesen einer komplizierten csv Datei
  Antworten mit Zitat      
Hallo Zusammen,

ich stehe vor dem Problem, dass ich eine für meine Begriffe (als absoluter Matlab Neuling) komplizierte csv. Datei einlesen möchte um später die darin enthaltenen Werte grafisch auszuwerten.

Dabei sind die ersten vier Spalten für mich nicht von Interesse und könnten beim einlesen gelöscht werden, ebenso wie die Überschrift der ersten Zeile und die darunter liegende Leerzeile(über Headliners?!).

Ein weiteres Problem stellt das Dezimaltrennzeichen dar. In der csv Datei ist dies bislang ein , und so funktioniert das einlesen über textscan leider nicht. Hierzu habe ich im Forum dieses Skript gefunden

Code:
%
fid = fopen('DeineDatei.csv');
C = textscan(fid,'%s %s %s %s','delimiter',';');
fclose(fid);

[Datum,Wert1,Wert2,Wert3] = C{:};

Wert1_neu = strrep(Wert1,'.',',');
Wert2_neu = strrep(Wert2,'.',',');
Wert3_neu = strrep(Wert3,'.',',');

fid = fopen('DeineNeueDatei.csv','w');
for l = 1:length(Datum)
    fprintf(fid,'%s; %s; %s; %s;\n',Datum{l},Wert1_neu{l},Wert2_neu{l},Wert3_neu{l});
end
fclose(fid);
 


Ich habe versucht diesen Code auf eine vereinfachte Ausführung der Datei anzuwenden allerdings erhalte ich immer die folgende Fehlermeldung: Error: Expression or statement is incorrect--possibly unbalanced (,(, or [.


Da ich wenig bis keine Grundkenntnisse in Matlab besitze wäre es super wenn ihr mir relativ präzise Lösungsansätze vermitteln könntet. Anbei die Datei als Zip.

Vielen Dank im Voraus!

DateiV1.zip
 Beschreibung:

Download
 Dateiname:  DateiV1.zip
 Dateigröße:  20.77 KB
 Heruntergeladen:  278 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2015, 12:49     Titel:
  Antworten mit Zitat      
Hallo,

zur Problematik des Dezimaltrennzeichens siehe auch hier:
http://www.mathworks.com/matlabcent.....-with-comma-decimal-point
Der Vorschlag von Per Isakson dürfte schneller, eleganter und flexibler sein als der Ansatz hier. Die modifizierte Datei kann mit textscan eingelesen werden.

Die Fehlermeldung deutet auf falsch gesetzte Klammern hin. In dem von dir geposteten Code kann ich allerdings kein derartiges Problem finden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.04.2015, 12:51     Titel: Re: Einlesen einer komplizierten csv Datei
  Antworten mit Zitat      
Hallo Sebastianvsmatlab,

Zitat:
Error: Expression or statement is incorrect--possibly unbalanced (,(, or [.

Die Meldung bedeutet, dass Du einen Tippfehler im Code hast. Wird in der Meldung vielleicht noch erwähnt, in welcher Zeile das ist?
Bekommst Du warnungen im Editor?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.04.2015, 14:03     Titel:
  Antworten mit Zitat      
Code:
fid=fopen('DateiV1.csv')
M=textscan(fid,['%f %s %f ',repmat('%s',1,16)],'headerlines',4,'delimiter',';')
fclose(fid)
M(4)=[];
for k=4:numel(M);
M{k}=strrep(M{k},',','.');
M{k}=cellfun(@str2num,M{k});
end

das klappt bei mir
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastianvsmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2015, 15:34     Titel:
  Antworten mit Zitat      
Hallo Winkow,

vielen Dank für deinen Vorschlag. Mir ist leider ein Fehler unterlaufen und ich habe die falsche Datei ausgewählt. Die richtige Datei ist leicht anders ich wäre dir sehr dankbar wenn du den Code für diese Datei noch einmal anpassen könntest.

Ich habe es bereits selbst versucht doch leider tappe ich bisher noch etwas im dunkeln was die Auswirkung der einzelnen Befehle angeht


Vielen Dank im Voraus.

DatenA.zip
 Beschreibung:

Download
 Dateiname:  DatenA.zip
 Dateigröße:  24.33 KB
 Heruntergeladen:  248 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.04.2015, 15:56     Titel:
  Antworten mit Zitat      
war mir zu auffwändig da die zeichen zu zählen. darum hab ich jetzt alles als string eingelesen.
Code:
fid=fopen('DatenA.csv')
M=textscan(fid,'%s','headerlines',2,'delimiter',';');
M=reshape(M{1},[],1049);
fclose(fid)

die umwandlung zu nummern musst du dann einfach analog zu oben machen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastianvsmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2015, 16:17     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort,

leider erscheint bei mir folgende Fehlermeldung:
Error using reshape
Product of known dimensions, 1049, not divisble into total number of elements, 3396.

Wenn ich nun bei reshape die Anzahl auf eine Zahl setze durch welche 3396 teilbar is erscheint folgende Fehlermeldung:

Error using cellfun Input#2 expected to be a cell array was char instead


Hast du dafür ein Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.04.2015, 16:43     Titel:
  Antworten mit Zitat      
ich has für die datei gemacht die du mir gegeben hast. wenn in anderen dateien mehr werte sind geht das so nicht. dann musst du mal die 76 setzen anstatt die 1049 solange pro zeile immernoch so viele elemente sind.
sollte das auch varieren musst du doch mal durch zählen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastianvsmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2015, 17:05     Titel:
  Antworten mit Zitat      
Bei mir is es auch noh dieselbe Datei, ich habe nun die Spaltenanzahl mit folgendem Code verwendet:

Code:
%
fid=fopen('C:\Users\Tablet1\Desktop\Sebastian\DatenA.CSV')
M=textscan(fid,'%s','headerlines',2,'delimiter',';');
M=reshape(M{1},76,[]);
fclose(fid);
M(4)=[];
for k=4:numel(M);
M{k}=strrep(M{k},',','.');
M{k}=cellfun(@str2num,M{k});
end

 



Es kommt aber immer zu dieser Fehlermeldung:

Error using ==> cellfun
Input #2 expected to be a cell array, was char instead.

Ich bin leider überfragt was zu tun ist und wäre über weitere Hilfestellung sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.04.2015, 18:33     Titel:
  Antworten mit Zitat      
das wird jetzt ja auch anders abgespeichert. das geht so nicht mehr
Code:
fid=fopen('DatenA.csv')
M=textscan(fid,'%s','headerlines',2,'delimiter',';');
M=reshape(M{1},76,[]);
fclose(fid)

M(5:end,:)=strrep(M(5:end,:),',','.');
numeric=cellfun(@str2num,M(5:end,:));

im numeric sind jetzt die zahlen drin.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastianvsmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2015, 12:49     Titel:
  Antworten mit Zitat      
Vielen Dank Winkow!
Der Code funktioniert bei mir fehlerfrei, allerdings habe ich das Problem, dass ich nicht weiß wie ich auf die Zahlen in numeric zugreifen kann.

Ich wollte eine Spalte plotten über plot (numeric{1,5}) und erhalte folgende Fehlermeldung:

Cell contents reference from a non-cell array object.

Wo liegt mein Fehler? Grundsätzlich habe ich vor die Werte einer Spalte über die Zeit in einem Diagramm darzustellen..

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 13:09     Titel:
  Antworten mit Zitat      
numeric ist kein cell array sondern ein normals array. das muss man dann auch so adressieren. das sagt aber auch die fehlermeldung.
eine spalte pltottest du dann mit
Code:
plot(numeric(:,5)
am besten du guckst dir die daten mal im workspace an.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastianvsmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2015, 11:30     Titel:
  Antworten mit Zitat      
Hallo Zusammen,

ich stehe mal wieder beim Einlesen einer Datei auf dem Schlauch. Ich habe versucht das Beispiel von Winkow anzupassen, leider tritt wieder eine Fehlermeldung auf:

Code:
fid2=fopen('DateiTK')
M2=textscan(fid2,'%s','headerlines',4,'delimiter',';');
M2=reshape(M2{1},20,[]);
fclose(fid)
M2(5:end,:)=strrep(M2(5:end,:),',','.');
numeric=cellfun(@str2num,M(5:end,:));

??? Error using ==> reshape
Product of known dimensions,
20, not divisible into total
number of elements, 16645.

Error in ==> Plot_TK at 5


Wenn ich die Datei über den text editor ansehe erfolgt die Trennund der Dezimalzahlen identisch zu der vorherigen Datei.

Vielleicht erkennt ihr ja wo der Fehler liegt..

Anbei die Datei.

Vielen Dank :)


M2=reshape(M2{1},[],20);


DateiTK.zip
 Beschreibung:

Download
 Dateiname:  DateiTK.zip
 Dateigröße:  22.23 KB
 Heruntergeladen:  272 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.05.2015, 11:43     Titel:
  Antworten mit Zitat      
du hast 19 elemente pro zeile und nicht 20. das ist der fehler. das findet man raus indem man per hand kurz nachzählt
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastianvsmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 22.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2015, 11:54     Titel:
  Antworten mit Zitat      
Hallo Winkow,

entschuldige den blöden Fehler, ansich sollte die Datei 20 Spalten haben, da ist leider bei der Erfassung der Messwerte etwas schief gegangen..

Vielen Dank:)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.