Suche…


Textscan

Angenommen, Sie haben formatierte Daten in einer großen Textdatei oder Zeichenfolge, z

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

man kann mit textscan das ziemlich schnell lesen. fopen sich dazu eine fopen der Textdatei mit fopen :

fid = fopen('path/to/myfile');

Angenommen, für die Daten in diesem Beispiel möchten wir die erste Spalte "Daten" ignorieren, Datum und Uhrzeit als Zeichenfolgen lesen und die restlichen Spalten als Doubles lesen, dh

 Data  ,  2015-09-16  , 15:41:52;801  , 800.000000  , 1.5123  ,  0.0043
ignore      string         string         double      double     double

Rufen Sie dazu an:

data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');

Das Sternchen in %*s bedeutet "diese Spalte ignorieren". %s bedeutet "als String interpretieren". %f bedeutet "als Doppelte interpretieren (Floats)". 'Delimiter',',' gibt schließlich an, dass alle Kommas als Trennzeichen zwischen den einzelnen Spalten interpretiert werden sollten.

Um zusammenzufassen:

fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');

data enthält jetzt ein Zellenfeld mit jeder Spalte in einer Zelle.

Datums- und Zeitzeichenfolgen in numerischen Feldern schnell

Das Konvertieren von Datums- und Zeitzeichenfolgen in numerische Arrays kann mit datenum Lesen einer großen datenum kann jedoch nur die Hälfte der Zeit in datenum nehmen.

Beachten Sie die Daten im Beispiel Textscan . Indem Sie mit Texten Datum und Uhrzeit als ganze Zahlen interpretieren, können sie schnell in ein numerisches Array umgewandelt werden.

Dh eine Zeile in den Beispieldaten würde interpretiert 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

was gelesen wird als:

fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %f %f %f %f %f %f %f %f %f %f','Delimiter',',-:;');
fclose(fid);

Jetzt:

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

Die Verwendung von datenum auf 566.678 Elementen erforderte 6.626570 Sekunden, während die obige Methode 0,048334 Sekunden benötigte, dh 0,73% der Zeit für datenum oder ~ 137-mal schneller.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow