2009-10-29 22 views
10
datetime, M01, M02, M03, M04, M05, M06 
8/15/2009 0:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9 
8/15/2009 0:10, 7.1, 8.1, 8.1, 7.7, 0, 8.1 
8/15/2009 0:20, 6.8, 7.4, 7.6, 7.1, 0, 7.3 
8/15/2009 0:30, 5.6, 6.8, 7.1, 6.6, 0, 6.8 
8/15/2009 0:40, 3.9, 6.2, 6.4, 6.2, 0, 6.4 
8/15/2009 0:50, 4.6, 5.5, 6.1, 5.8, 0, 5.6 
8/15/2009 1:40, 7, 7, 7.2, 6.9, 0, 6.3 

Pomożesz mi czytać ten plik CSV właściwie tak mogę przekonwertować pierwszą kolumnę do łańcucha przy użyciu datenum? csvread oczywiście nie działa. Z textscan jestem zagubiony jak to nazwać, więc nie dostaję błędów. Data i godzina podane są w tej samej kolumnie.Odczyt z pliku CSV w programie MATLAB

Przepraszamy, może to zabrzmieć głupie pytanie !!!

Wiem, jak czytać, przeczytaj powyższy plik teraz. ale jak mogę to zapisać w pliku file.txt w dokładnie tym samym formacie? To znaczy zmodyfikowano kilka kolumn i teraz potrzebujemy plik podobny z tym samym formacie dla kolumny 1 i wiersza 1. Dzięki za pomoc

+0

Jeśli plik zawiera wartości oddzielonych przecinkami, to gdzie są przecinki się w powyższej próbie? Czy są przecinki oddzielające wartości daty i godziny? – gnovice

+1

Nie każde pole jest oddzielone przecinkami. data i godzina są w jednym punkcie, więc nie ma między nimi przecinka, to jest bardziej podobne do 8/15/2009 0: 00: 10,58,8,7.8,7 .3,0, 7,9 –

Odpowiedz

15

Według komentarz powyżej, jeśli dane wygląda następująco:

datetime, M01, M02, M03, M04, M05, M06 
8/15/2009 0:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9 
8/15/2009 0:10, 7.1, 8.1, 8.1, 7.7, 0, 8.1 
8/15/2009 0:20, 6.8, 7.4, 7.6, 7.1, 0, 7.3 
8/15/2009 0:30, 5.6, 6.8, 7.1, 6.6, 0, 6.8 
8/15/2009 0:40, 3.9, 6.2, 6.4, 6.2, 0, 6.4 
8/15/2009 0:50, 4.6, 5.5, 6.1, 5.8, 0, 5.6 
8/15/2009 1:40, 7, 7 7.2, 6.9, 0, 6.3 

następnie użyć następujących ją czytać jako matrycy:

fid = fopen('file.csv', 'rt'); 
a = textscan(fid, '%s %f %f %f %f %f %f', ... 
     'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1); 
fclose(fid); 

format short g 
M = [datenum(a{1}) a{2}] 

... i wyjściu uzyskać:

M = 
    7.34e+005  5.8  7.8  7.8  7.3   0  7.9 
    7.34e+005  7.1  8.1  8.1  7.7   0  8.1 
    7.34e+005  6.8  7.4  7.6  7.1   0  7.3 
    7.34e+005  5.6  6.8  7.1  6.6   0  6.8 
    7.34e+005  3.9  6.2  6.4  6.2   0  6.4 
    7.34e+005  4.6  5.5  6.1  5.8   0  5.6 
    7.34e+005   7   7  7.2  6.9   0  6.3 

jeśli ustawić wyświetlanie format do długiego wyjścia, widać pełne numery (nie e są one nadal przechowywane w całości) lub użyj fprintf:

fprintf('%.9f\n', M(:,1)) 
734000.000000000 
734000.006944445 
734000.013888889 
734000.020833333 
734000.027777778 
734000.034722222 
734000.069444445 
+0

i użył podobnego kodu i nawet kiedy skopiować kod uzyskać ten sam rezultat 7,340000000000000 0,000058000000000 0,000078000000000 7,340000069444445 0,000071000000000 0,000081000000000 7,340000138888889 0,000068000000000 0,000074000000000 ja właśnie skopiowane wynik 3 rzędach n kolumny o/p dlaczego liczby są podzielone przez 100000? kiedy próbuję zrobić M = [datenum (a (1)) a (2)] dostaję dziwne ans. również, gdy zmieniam daty, otrzymuję ten sam zestaw ciągów w kolumnie 1, więc nie wiem, co się dzieje. Jakieś wskazówki? –

+0

@AP: Zaktualizowałem swój wpis, aby odpowiedzieć na twoje pytanie. – Amro

+0

Wielkie dzięki. rządzisz!! Działa teraz. Czy możesz mi wytłumaczyć, co robi "rt", "collectoutput"? g po krótkim formacie nie ma? jesteś niesamowity! –

2

TEXTSCAN sama nie będzie konwertować datę, ale można nazwać tylko na DATENUM kolumna, która tego potrzebuje.

f = fopen('datafile.txt'); 
data = textscan(f, '%s %f %f %f %f %f %f', 'Delimiter', ',', 'HeaderLines', 1); 
fclose(f); 
data{1} = datenum(data{1}); 

powróci układ komórkowy data podwaja się, gdy pierwsza kolumna jest datenum MATLAB odpowiadające każdy dzień, a każda inna kolumna jest odpowiednia kolumna z pliku.

+0

Dzięki ... ......... –