2013-10-26 17 views
12

Próbuję odczytać w pliku .csv z MATLAB. Tu jest mój kodu:Czytanie plików CSV z MATLAB?

csvread('out2.csv') 

To co out2.csv wygląda następująco:

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 

Na oknach jestem w stanie przeczytać dokładnie ten sam plik z funkcją xlsread bez żadnych problemów. Obecnie jestem na komputerze z systemem Linux. Kiedy po raz pierwszy użyłem xlsread do odczytu pliku, powiedziano mi, że "Plik nie ma rozpoznanego formatu", więc przełączyłem się na używanie csvread. Jednak za pomocą programu csvread pojawia się następujący komunikat o błędzie:

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) 

Myślę, że przyczyną jest problem "/" w dniu. W systemie Windows pierwsza kolumna jest interpretowana jako ciąg znaków. Na Linuksie wydaje się, że jest interpretowany jako liczba, więc próbuje odczytać liczbę i nie powiedzie się na odwrotnym ukośniku. Tak przynajmniej myślę. Każda pomoc będzie naprawdę doceniona.

+1

próby [READTEXT] (http://www.mathworks.com/matlabcentral/fileexchange/10946-readtext) zamiast 'csvread'. –

Odpowiedz

22

csvread może czytać tylko duble, więc dławi się w polu daty. Użyj textscan.

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

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

Aktualizacja (8/31/2017)

Ponieważ ten został napisany z powrotem w 2013 roku, textscan funkcja Matlaba został zaktualizowany do bezpośredniego odczytu daty i godziny. Teraz kod będzie wyglądać następująco:

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

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

alternatywa jak wspomniano przez @Victor Hugo poniżej (i obecnie moja osobista iść do tego typu sytuacji) byłoby użyć readtable który zaakceptuje ten sam ciąg formatowania jak textscan ale zebrać wyniki bezpośrednio do obiektu tabeli:

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

Niestety the documentation dla csvread wyraźnie stwierdza:

M = csvread(filename) odczytuje wartość sformatowany plik oddzielonych przecinkami, filename. Plik może zawierać tylko wartości liczbowe.

Od / jest ani przecinek, ani wartością liczbową, produkuje błąd.