Verfasst am: 26.06.2013, 16:48
Titel: "Komplexe" .csv-Datei in Matlab importieren
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!?
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!!!
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:
13 . 11 . 201208 : 19 : 32 ; 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 0007771172 ; 50 , 000000000000 ; 50 , 000000000000 ; 20 , 6790 ; - 1 . 033 , 9500 ; 7 . 905 , 1000
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:
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}='13 . 11 . 201208 : 19 : 32 ; 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 0007771172 ; 50 , 000000000000 ; 50 , 000000000000 ; 20 , 6790 ; - 1 . 033 , 9500 ; 7 . 905 , 1000'
C{2}='13 . 11 . 201208 : 19 : 32 ; 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 0007771172 ; 50 , 000000000000 ; 50 , 000000000000 ; 20 , 6790 ; - 1 . 033 , 9500 ; 7 . 905 , 1000'
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))
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.
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.
fid = fopen('WF000ARMS1-account-statement-20130628140020.csv');
i = 1;
while ~feof(fid)
tline = fgetl(fid);
length(tline);
iflength(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)
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
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.