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

"Komplexe" .csv-Datei in Matlab importieren

 

BoWallace
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 26.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2013, 16:48     Titel: "Komplexe" .csv-Datei in Matlab importieren
  Antworten mit Zitat      
Ja, ich weiß: "Schon wieder so ein Dummy, der es nicht hinbekommt csvread, textscan oder sonstige Funktionen richtig einzusetzen."

Zum Thema:
Ich habe im Anhang ein Bild der zu importierenden .csv-Datei eingestellt.
Mein Ziel ist es, diese Datei in Matlab ein zu lesen und, im Idealfall als "normale" Matrix, weiter zu verwenden. Im Prinzip würde es auch ausreichen, wenn ich ab Zeile 6 die Daten erhalte.
Bei der Verwendung von o.g. csvread, textscan und csvimport stoße ich bislang an meine Grenzen.

Vielleicht gibt es ja jemanden Hilfsbereiten, der schon ähnliche Probleme hatte und eine anschauliche Lösung für mein Problem findet!?

Inhalt csv-Datei.png
 Beschreibung:

Download
 Dateiname:  Inhalt csv-Datei.png
 Dateigröße:  136.15 KB
 Heruntergeladen:  1751 mal
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 27.06.2013, 15:02     Titel:
  Antworten mit Zitat      
Hallo,
CSVREAD funktioniert nur auf einfachen Formaten, wenn CSV nur aus Zahlen besteht und keinen Header hat

TEXTSCAN wäre hier die richtige Wahl, aber anhand des Bildes kann man dir kaum helfen, weil du das nach Excel importiert hast, weiß man nicht, was für Trennzeichen in CSV verwendet wird. Besonders wichtig für Zeilen 14,15,35, 50.
Wenn da kein Trennzeichen vorhanden, dann ist das keine CSV Datei mehr und sie einzulesen wäre viel zu komplex

Außerdem deine Fließkommazahlen haben Punkt statt Komma, ist das richtig? Wenn ja dann wirst alles als String zuerst einlesen müssen und dann ersetzen

Poste doch dein Code dazu und erkläre was nicht klappt!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
BoWallace
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 26.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2013, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für die Hilfsbereitschaft.

Ich habe folgenden Ansatz:
Code:
fid = fopen('WF000ARMS1-account-statement-20130627161638.csv');
C = textscan(fid, '%s %*s %s %s %s %s %*s %*s', 'delimiter', ';', 'headerlines', 5)
fclose(fid);
C = C{:}
datenum(C(:,1), 'dd.mm.yyyy HH:MM:SS')

Im letzten Teil habe ich schon versucht mit der Datumsspalte zu arbeiten. Funktioniert nur leider auch noch nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
BoWallace
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 26.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2013, 08:57     Titel:
  Antworten mit Zitat      
Ich bin mittlerweile schon einen Schritt weiter!

Ich schaffe es mittels folgendem Code nur die für mich relevanten Zeilen ein zu lesen.
Code:
fid = fopen('WF000ARMS1-account-statement-20130628140020.csv');
i = 1;
while ~feof(fid)
   tline = fgetl(fid);
   length(tline);
   if length(tline) > 250
       C{i} = tline;
       i = i+1;
   end
end
fclose(fid);
C{1}
C{2}(1:80)
C{3}
C{4}
C{5}

Jedoch werden mir die einzelnen Zeilen jetzt derart als String wiedergegeben, dass ich (noch) nicht damit weiter arbeiten kann. Ich erhalte für eine Zeile folgende Ausgabe:
Code:
ans =

   1   3   .   1   1   .   2   0   1   2       0   8   :   1   9   :   3   2   ;   W   e   r   t   p   a   p   i   e   r   -   T   r   a   n   s   a   k   t   i   o   n       (   K   a   u   f   )   ;   D   E   0   0   0   7   7   7   1   1   7   2   ;   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0   ;   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0   ;   2   0   ,   6   7   9   0   ;   -   1   .   0   3   3   ,   9   5   0   0   ;   7   .   9   0   5   ,   1   0   0   0  


Wie kann ich daraus jetzt die einzelnen Werte aufteilen?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 01.07.2013, 13:00     Titel:
  Antworten mit Zitat      
Hallo


Zitat:
Im letzten Teil habe ich schon versucht mit der Datumsspalte zu arbeiten. Funktioniert nur leider auch noch nicht.


das ist für uns nicht sehr hilfreich, wenn du schreibst "FUNKTIONIERT NICHT", aber nichts darüber berichtest, was genau nicht funktioniert. Wenn ein Fehler auftritt, bitte die komplette Fehlermeldung posten. Wir sind keine Hellseher!!!


zu der Frage am 27.06.2013 16:28
Was ist mit TEXTSCAN, was funktioniert dort nicht? Wie groß ist denn C?
Außerdem glaube ich , dass du in der Zeile (siehe unten das Codebeispiel) einen Fehler machst, deswegen klappt es nicht mit DATENUM.

Code:

% textscan liefert mehrere Cells,
% wenn du C =C{:} machst, dann bekommst du nur die letzte Zelle
C = [C{:}]
 



zu der Frage am 01.07.2013 08:57
Beim Letzten Versuch hast du komplette Zeilen die du wiederum auftrennen muss, z.B. mit REGEXP mit der SPLIT-Option
so:
Code:

regexp(C,';','split')
 


Zuletzt bearbeitet von denny am 01.07.2013, 14:51, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
BoWallace
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 26.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2013, 13:45     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für deinen Beitrag! Er hat mir schon weiter geholfen.

Ich habe jetzt mittels
Code:
regexp(C,';','split')
Die Zeilen aufteilen können.

Ich habe jetzt jedoch noch das Problem, dass sich die einzelnen Strings nicht umwandeln lassen. So habe ich beispielsweise versucht den Datumsstring
Code:
1   3   .   1   1   .   2   0   1   2       0   8   :   1   3   :   5   1
mittels
Code:
datenum(str, 'dd.mm.yyyy HH:MM:SS')
 
umzuwandeln. Hierbei erhielt ich folgende Fehlermeldung:
Code:
Error using datenum (line 179)
DATENUM failed.

Error in csveinlesen (line 21)
datenum(str, 'dd.mm.yyyy HH:MM:SS')

Caused by:
    Error using dtstr2dtnummx
    Failed on converting date string to date number.



Weiterhin habe ich versucht
Code:
1   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0  
 
mit Hilfe von
Code:
zu konvertieren. Dies überführte den String jedoch lediglich in eine NaN.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 01.07.2013, 14:41     Titel:
  Antworten mit Zitat      
Hallo

das klappt natürlich nicht weil du zwischen den einzelnen Zeichen noch die Leerzeichen hast, ich habe keine Ahnung, aber CSV hat scheinbar sehr schlechtes Format.
Genau gleich sieht das bei der Kommazahlen, auch hier kommen die Leerzeichen vor. Außerdem vor dem Konvertieren zum Double, musst du Komma durch Punkt ersetzen. Das Problem bei deinem Format ist der Punkt, welcher zur Auftrennung der tausender Einheiten genutzt wird. Der Punkt musst du hier auch entsprechend berücksichtigen.
Damit meine ich, dass du zuerst die Punkte entfernen muss, bevor du die Kommas ersetzen kannst.

Um die Zeichen zu ersetzen, nutzte REGEXPREP.
Code:

C = {};

C{1}='   1   3   .   1   1   .   2   0   1   2       0   8   :   1   9   :   3   2   ;   W   e   r   t   p   a   p   i   e   r   -   T   r   a   n   s   a   k   t   i   o   n       (   K   a   u   f   )   ;   D   E   0   0   0   7   7   7   1   1   7   2   ;   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0   ;   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0   ;   2   0   ,   6   7   9   0   ;   -   1   .   0   3   3   ,   9   5   0   0   ;   7   .   9   0   5   ,   1   0   0   0 '

C{2}='   1   3   .   1   1   .   2   0   1   2       0   8   :   1   9   :   3   2   ;   W   e   r   t   p   a   p   i   e   r   -   T   r   a   n   s   a   k   t   i   o   n       (   K   a   u   f   )   ;   D   E   0   0   0   7   7   7   1   1   7   2   ;   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0   ;   5   0   ,   0   0   0   0   0   0   0   0   0   0   0   0   ;   2   0   ,   6   7   9   0   ;   -   1   .   0   3   3   ,   9   5   0   0   ;   7   .   9   0   5   ,   1   0   0   0 '

C = regexp(C,';','split')
%
% zusammensetzen zu einer Cell-Matrix
C = cat(1,C{:});

% Leerzeichen löschen
C = regexprep(C,'\s','')
% Punkt entfernen
C(:,4:end) = regexprep(C(:,4:end),'\.','')
% Komma duch Punkt ersetzen
C(:,4:end) = regexprep(C(:,4:end),',','.')
%
datenum(C(:,1),'dd.mm.yyyyHH:MM:SS')
str2double(C(:,4:end))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
BoWallace
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 26.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2013, 19:03     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Lösungsansätze. Jedoch scheint es weiterhin ein Problem zu geben:

Das Löschen der Leerzeichen mit
Code:
C = regexprep(C, '\s','');
scheint nicht zu funktionieren.

Wenn ich den ausgelesenen String
Code:
'   1   3   .   1   1   .   2   0   1   2      0   8   :   1   9   :   3   2   '
da durch schicke, kommt am Ende wieder das Selbe heraus.

Es kommt mir fast so vor, als handele es sich nicht um "normale" Leerzeichen.

Folglich wird bei
Code:
weiterhin der Fehler
Code:
Error using datenum (line 179)
DATENUM failed.

Error in csveinlesen (line 24)
datenum(C(:,1),'dd.mm.yyyy HH:MM:SS')

Caused by:
    Error using dtstr2dtnummx
    Failed on converting date string to date number.

ausgegeben.

Die Funktion
Code:
liefert leider weiterhin nur NaNs.
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: 02.07.2013, 10:42     Titel:
  Antworten mit Zitat      
Hallo BoWallace,

Der Haufen an Leerzeichen ist sehr merkwürdig. Irgendetwas ist beim Import deutlich schiefgelaufen. Hast Du das File unter Unix als UTF32-codiertes File gespeichert? Ein einfaches ASCII wäre deutlich einfacher.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 02.07.2013, 12:38     Titel:
  Antworten mit Zitat      
Hallo BoWallace,

habe deine CSV-Datei analysiert, liegt wirklich an CSV-Datei dort wurde das Null-Steuerzeichen zwischen Ziffern kodiert, deswegen wirken die Zwischenräume als ob das ein Leerzeichen verwendet wurde.

Das ist die Lösung mit der Textscan:
Code:
fid    = fopen('WF000ARMS1-account-statement-20130628140020.csv');

CSVheader = textscan(                 ...
   fid                          ,...
   '%s %s %s %s %s %s %s %s' ,...
   1                            ,...
   'delimiter',';'              ,...
   'headerlines',4              ,...
   'CollectOutput', true);

CSVheader = [CSVheader{:}];
CSVheader = regexprep(CSVheader, sprintf('%c',0),'');%Löschen des Nullsteuerzeichens


CSVbody      =  textscan(                 ...
   fid                          ,...
   '%s %s %s %s %s %s %s %s' ,...
   'delimiter',';'              ,...
   'headerlines',5              ,...
   'CollectOutput', true);

fclose(fid);

CSVbody          = [CSVbody{:}];

CSVbody          = regexprep(CSVbody, sprintf('%c',0),'');% Löschen des Nullsteuerszeichens
CSVbody(:,4:end) = regexprep(CSVbody(:,4:end),'\.',''); % Entfernen der Punkte
CSVbody(:,4:end) = regexprep(CSVbody(:,4:end),',','.'); % Setzen der Kommata

datenum(CSVbody(:,1),'dd.mm.yyyy HH:MM:SS')
str2double(CSVbody(:,4:end))





das ist die Lösung mit deinen Ansatz:

Code:


fid = fopen('WF000ARMS1-account-statement-20130628140020.csv');
i = 1;
while ~feof(fid)
   tline = fgetl(fid);
   length(tline);
   if length(tline) > 399
       C{i} = tline;
       C{i} = regexp(C{i}, ';', 'split');
       i = i+1;      
   end
end
fclose(fid);

C = cat(1,C{2:end}); % Zusammenfügen der Zeilen
C = regexprep(C, sprintf('%c',0),''); % Löschen der Null-Steuerzeichens
C(:,4:end) = regexprep(C(:,4:end),'\.',''); % Entfernen der Punkte
C(:,4:end) = regexprep(C(:,4:end),',','.'); % Setzen der Kommata
C(:,7)

datenum(C(:,1),'dd.mm.yyyy HH:MM:SS')
str2double(C(:,4:end))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
BoWallace
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 26.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2013, 13:34     Titel:
  Antworten mit Zitat      
Super!
Vielen Dank!

Ich habe den Lösungsansatz mit
Code:
gewählt.

Nochmals vielen Dank für deine Unterstützung!
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 - 2024 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.