2013-10-26 21 views
12

Sto provando a leggere in un file .csv con MATLAB. Qui è il mio codice:Leggere i file CSV con MATLAB?

csvread('out2.csv') 

Questo è ciò che appare come out2.csv:

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 

Su Windows sono in grado di leggere questo stesso file con la funzione xlsread senza problemi. Sono attualmente su una macchina Linux. Quando ho usato xlsread per leggere il file, mi è stato detto che "File non è in formato riconosciuto", quindi sono passato a usare csvread. Tuttavia, utilizzando csvread, ricevo il seguente messaggio di errore:

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) 

penso che il '/' in data sta causando il problema. Su Windows, la prima colonna viene interpretata come una stringa. Su Linux sembra essere interpretato come un numero, quindi cerca di leggere il numero e fallisce nel backslash. Questo è quello che penso stia succedendo almeno. Qualsiasi aiuto sarebbe molto apprezzato.

+1

provare [READTEXT] (http://www.mathworks.com/matlabcentral/fileexchange/10946-readtext) invece di 'csvread'. –

risposta

22

csvread può solo leggere i doppi, quindi è soffocamento sul campo della data. Utilizzare textscan.

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

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

Aggiornamento (8/31/2017)

Dal momento che questo è stato scritto di nuovo nel 2013, la funzione di MATLAB textscan è stato aggiornato per leggere direttamente date e gli orari. Ora il codice sarebbe simile a questa:

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

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

Un'alternativa come detto da @Victor Hugo qui sotto (e attualmente il mio personale go-to per questo tipo di situazione) potrebbe essere quella di utilizzare readtable che accettare la stessa stringa di formattazione come textscan ma assemblare i risultati direttamente in un oggetto tabella:

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

Purtroppo, the documentation per csvread afferma chiaramente:

M = csvread(filename) legge un valore formattato file separato da virgole, filename. Il file può contenere solo valori numerici.

Da / è né una virgola, né un valore numerico, produce un errore.

Problemi correlati