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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow