2013-10-26 13 views
12

Ich versuche, eine .csv-Datei mit MATLAB einzulesen. Hier ist mein Code:Lesen von CSV-Dateien mit MATLAB?

csvread('out2.csv') 

Dies ist, was out2.csv wie folgt aussieht:

03/09/2013 23:55:12,129.32,129.33 
03/09/2013 23:55:52,129.32,129.33 
03/09/2013 23:56:02,129.32,129.33 

Auf Fenster Ich bin der Lage, diese genau die gleiche Datei mit der xlsread Funktion ohne Probleme zu lesen. Ich bin derzeit auf einem Linux-Rechner. Als ich xlsread das erste Mal benutzte, um die Datei zu lesen, wurde mir gesagt "Datei ist nicht im erkannten Format", also wechselte ich zu csvread. Doch mit csvread, erhalte ich die folgende Fehlermeldung:

Error using dlmread (line 139) 
Mismatch between file and format string. 
Trouble reading number from file (row 1u, field 2u) ==> /09/2013 
23:55:12,129.32,129.33\n 

Error in csvread (line 48) 
m=dlmread(filename, ',', r, c) 

Ich denke, die ‚/‘ in dem Datum das Problem verursacht. Unter Windows wird die 1. Spalte als String interpretiert. Unter Linux scheint es als Zahl interpretiert zu werden, also versucht es die Zahl zu lesen und schlägt am Backslash fehl. Das ist, was ich denke zumindest passiert. Jede Hilfe würde wirklich geschätzt werden.

+1

versuchen [read] (http://www.mathworks.com/matlabcentral/fileexchange/10946-readtext) statt 'csvread'. –

Antwort

22

csvread kann nur Doppel lesen, so dass es auf dem Datumsfeld erstickt. Verwenden Sie textscan.

fid = fopen('out2.csv'); 
out = textscan(fid,'%s%f%f','delimiter',','); 
fclose(fid); 

date = datevec(out{1}); 
col1 = out{2}; 
col2 = out{3}; 

-Update (8/31/2017)

Da dies im Jahr 2013 geschrieben wurde, zurück textscan Funktion MATLAB wurde direkt Daten und Zeiten lesen aktualisiert. Nun würde der Code wie folgt aussehen:

fid = fopen('out2.csv'); 
out = textscan(fid, '%{MM/dd/uu HH:mm:ss}D%f%f', 'delimiter', ','); 
fclose(fid) 

[date, col1, col2] = deal(out{:}); 

Eine Alternative wie erwähnt von @Victor Hugo unten (und zur Zeit meine persönliche Go-to für diese Art von Situation) wäre readtable zu verwenden, die die gleiche Formatierung Zeichenfolge akzeptieren wie textscan aber die Ergebnisse direkt in ein Tabellenobjekt montieren:

dataTable = readtable('out2.csv', 'Format', '%{MM/dd/uu HH:mm:ss}D%f%f') 
dataTable.Properties.VariableNames = {'date', 'col1', 'col2'}; 

dataTable = 

    3×3 table 

      date    col1  col2 
    ___________________ ______ ______ 

    03/09/2013 23:55:12 129.32 129.33 
    03/09/2013 23:55:52 129.32 129.33 
    03/09/2013 23:56:02 129.32 129.33 
6

Leider the documentation für csvread eindeutig fest:

M = csvread(filename) liest eine kommagetrennte Datei formatiert, filename. Die Datei darf nur numerische Werte enthalten.

Da / ist weder ein Komma, noch ein numerischer Wert, wird ein Fehler ausgegeben.