MATLAB Language
Odczytywanie dużych plików
Szukaj…
SMS-y
Załóżmy, że sformatowałeś dane w dużym pliku tekstowym lub ciągu, np
Data,2015-09-16,15:41:52;781,780.000000,0.0034,2.2345
Data,2015-09-16,15:41:52;791,790.000000,0.1255,96.5948
Data,2015-09-16,15:41:52;801,800.000000,1.5123,0.0043
można używać textscan
do textscan
czytania. Aby to zrobić, uzyskaj identyfikator pliku tekstowego za pomocą fopen
:
fid = fopen('path/to/myfile');
Załóżmy, że dla danych w tym przykładzie chcemy zignorować pierwszą kolumnę „Dane”, odczytać datę i godzinę jako ciągi znaków, a resztę kolumn odczytać jako podwójną, tj.
Data , 2015-09-16 , 15:41:52;801 , 800.000000 , 1.5123 , 0.0043
ignore string string double double double
Aby to zrobić, zadzwoń:
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');
Gwiazdka w %*s
oznacza „zignoruj tę kolumnę”. %s
oznacza „interpretuj jako ciąg”. %f
oznacza „interpretuj jako podwójne (liczba zmiennoprzecinkowa)”. Wreszcie 'Delimiter',','
stwierdza, że wszystkie przecinki należy interpretować jako separator między każdą kolumną.
Podsumowując:
fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');
data
zawierają teraz tablicę komórek z każdą kolumną w komórce.
Ciągi daty i godziny do tablicy numerycznej szybko
Konwertowanie ciągów daty i godziny na tablice numeryczne można wykonać za pomocą datenum
, chociaż może to zająć nawet połowę czasu odczytu dużego pliku danych.
Rozważ dane w przykładzie Textscan . Ponownie, używając textcan i interpretując datę i godzinę jako liczby całkowite, można je szybko przekonwertować na tablicę numeryczną.
Tj. Wiersz w przykładowych danych będzie interpretowany jako:
Data , 2015 - 09 - 16 , 15 : 41 : 52 ; 801 , 800.000000 , 1.5123 , 0.0043
ignore double double double double double double double double double double
które będą czytane jako:
fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %f %f %f %f %f %f %f %f %f %f','Delimiter',',-:;');
fclose(fid);
Teraz:
y = data{1}; % year
m = data{2}; % month
d = data{3}; % day
H = data{4}; % hours
M = data{5}; % minutes
S = data{6}; % seconds
F = data{7}; % milliseconds
% Translation from month to days
ms = [0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
n = length(y); % Number of elements
Time = zeros(n,1); % Declare numeric time array
% Algorithm for calculating numeric time array
for k = 1:n
Time(k) = y(k)*365 + ms(m(k)) + d(k) + floor(y(k)/4)...
- floor(y(k)/100) + floor(y(k)/400) + (mod(y(k),4)~=0)...
- (mod(y(k),100)~=0) + (mod(y(k),400)~=0)...
+ (H(k)*3600 + M(k)*60 + S(k) + F(k)/1000)/86400 + 1;
end
Wykorzystanie datenum
na 566,678 elementach wymagało 6,626570 sekund, podczas gdy powyższa metoda wymagała 0,048334 sekund, tj. 0,73% czasu na datenum
lub ~ 137 razy szybciej.