Recherche…


textescan

Supposons que vous ayez formaté des données dans un fichier texte ou une chaîne volumineuse, par exemple

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

on peut utiliser textscan pour le lire assez rapidement. Pour cela, obtenez un identifiant de fichier du fichier texte avec fopen :

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

Supposons pour les données de cet exemple que nous souhaitons ignorer la première colonne "Données", lire la date et l’heure sous forme de chaînes et lire le reste des colonnes en double, c.-à-d.

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

Pour ce faire, appelez:

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

L'astérisque dans %*s signifie "ignorer cette colonne". %s signifie "interpréter comme une chaîne". %f signifie "interpréter comme des doubles (flottants)". Enfin, 'Delimiter',',' indique que toutes les virgules doivent être interprétées comme le délimiteur entre chaque colonne.

Pour résumer:

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

data contiennent maintenant un tableau de cellules avec chaque colonne dans une cellule.

Chaînes de date et d'heure vers un tableau numérique rapide

La conversion des chaînes de date et d'heure en tableaux numériques peut s'effectuer avec le datenum , bien que la lecture d'un fichier de données volumineux puisse prendre jusqu'à la moitié du temps.

Considérons les données dans l'exemple Textscan . En utilisant à nouveau les Texscan et en interprétant la date et l’heure comme des nombres entiers, ils peuvent être rapidement convertis en un tableau numérique.

Une ligne dans l'exemple de données serait interprétée comme suit:

 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

qui sera lu comme:

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

À présent:

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

En utilisant le datenum sur 566 678 éléments, il fallait 6,626570 secondes, alors que la méthode ci-dessus nécessitait 0,048334 seconde, soit 0,73% du temps pour le datenum ou ~ 137 fois plus vite.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow