MATLAB Language
Lecture de gros fichiers
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.