MATLAB Language
Grote bestanden lezen
Zoeken…
textSCAN
Stel dat u gegevens hebt geformatteerd in een groot tekstbestand of een reeks, bijvoorbeeld
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
men kan textscan
gebruiken om dit vrij snel te lezen. Hiertoe krijgt u een bestands-ID van het tekstbestand met fopen
:
fid = fopen('path/to/myfile');
Stel dat we voor de gegevens in dit voorbeeld de eerste kolom "Gegevens" willen negeren, de datum en tijd als tekenreeksen willen lezen en de rest van de kolommen als dubbele waarden willen lezen, dwz
Data , 2015-09-16 , 15:41:52;801 , 800.000000 , 1.5123 , 0.0043
ignore string string double double double
Bel hiervoor:
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');
Het sterretje in %*s
betekent "negeer deze kolom". %s
betekent "interpreteren als een string". %f
betekent "interpreteren als dubbels (floats)". Ten slotte stelt 'Delimiter',','
dat alle komma's moeten worden geïnterpreteerd als het scheidingsteken tussen elke kolom.
Opsommen:
fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');
data
nu een celarray met elke kolom in een cel.
Datum- en tijdreeksen naar numerieke array snel
Het omzetten van datum- en tijdreeksen in numerieke arrays kan worden gedaan met datenum
, hoewel het wel de helft van de tijd kan kosten om een groot gegevensbestand te lezen.
Beschouw de gegevens in bijvoorbeeld Textscan . Door opnieuw tekstscan te gebruiken en datum en tijd als gehele getallen te interpreteren, kunnen ze snel worden omgezet in een numerieke array.
Dwz een regel in de voorbeeldgegevens zou worden geïnterpreteerd als:
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
die wordt gelezen als:
fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %f %f %f %f %f %f %f %f %f %f','Delimiter',',-:;');
fclose(fid);
Nu:
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
Het gebruik van datenum
op 566.678 elementen vereiste 6,626570 seconden, terwijl de bovenstaande methode 0,048334 seconden vereiste, dat wil zeggen 0,73% van de tijd voor datenum
of ~ 137 keer sneller.