Oui, enfin, pour faire ce qu'il veut, j'utiliserais Perl ou Python. C'est le genre de langage adapté à ce genre de traitement (c'est pas pour rien qu'ils sont pas mal utilisé en traitement des données génétiques)
Grosso modo en perl ça ressemblerait à
#!/usr/local/bin/perl -w
use strict;
use warnings;
use autodie;
my $filename = '...';
open (my $data_fh, '<', $filename);
while ( <$data_fh> ) {
if (/^...... un pattern correspondant a la structure des lignes..$/o) {
# on a matché les groupes
my ($heure, $latitude, $longitude, $valeur) = ($1, $2, $3, $4);
$latitude = arrondir($latitude); # routine arrondir a écrire
mkdir $latitude unless (-d $latitude);
mkdir $latitude.'/'.$longitude unless (-d $latitude.'/'.$longitude);
open ( my $out_fh, '>>', $latitude.'/'.$longitude.'/'.$heure);
print $out_fh $valeur, "\n"; # ou ce qui conviendra
close ( $out_fh );
}
}
close ($data_fh);
Et les interfaces DBI pour faire communiquer du code perl avec une BDD, c'est un truc qui marche très bien.
Et si on dispose de plus de 1Go de mémoire pour le programme, ce qui n'est pas si rare de nos jours, on peut d'abord
- lire en mémoire tout le fichier dans une structure type hash complexe,%data:
quand on a lu ($heure, $latitude, $longitude, $valeur), on va faire
push @{$data{$latitude}{$longitude}{$heure}}, $valeur
- parcourir le hash pour créer les répertoires et écrire dans les fichiers (ça permet de n'ouvrir qu'une fois chaque fichier dans lequel on va écrire)
Bref ce sera optimal en temps, puisqu'on ne fait que le nombre minimal possible d'appels au système pour créer et ouvrir des fichiers.
Le code ressemblerait à ceci:
#!/usr/local/bin/perl -w
use strict;
use warnings;
use autodie;
my $filename = '...';
open (my $data_fh, '<', $filename);
my %data;
while ( <$data_fh> ) {
if (/^...... un pattern correspondant a la structure des lignes..$/o) {
# on a matché les groupes
my ($heure, $latitude, $longitude, $valeur) = ($1, $2, $3, $4);
# note un code optimal utilisera des "named capture groups" directement pour éviter 4 assignations par ligne lue
$latitude = arrondir($latitude); # routine arrondir a écrire
if ( $data{$latitude}{$longitude}{$heure} ) {
push @{$data{$latitude}{$longitude}{$heure}}, $valeur;
}
else {
$data{$latitude}{$longitude}{$heure} = [$valeur];
}
}
}
close ($data_fh);
foreach my $latitude (keys %data) {
mkdir $latitude unless (-d $latitude);
foreach my $longitude (keys %{$data{$latitude}}) {
mkdir $latitude.'/'.$longitude unless (-d $latitude.'/'.$longitude);
foreach my $heure (keys %{$data{$latitude}{$longitude}}) {
open ( my $out_fh, '>', $latitude.'/'.$longitude.'/'.$heure);
foreach my $valeur (@{$data{$latitude}{$longitude}{$heure}}) {
print $out_fh $valeur, "\n"; # ou ce qui conviendra
}
close ( $out_fh );
}
}
}
Le code
if ( $data{$latitude}{$longitude}{$heure} ) {
push @{$data{$latitude}{$longitude}{$heure}}, $valeur;
}
else {
$data{$latitude}{$longitude}{$heure} = [$valeur];
}
peut peut-être être remplacé par
$data{$latitude}{$longitude}{$heure} //= [];
push @{$data{$latitude}{$longitude}{$heure}}, $valeur;
c'est a tester pour voir si c'est plus rapide.
Au prix d'un flag, on peut encore optimiser: quand on crée un répertoire, inutile de tester l'existence des sous répertoires ou fichiers, et les tests sur le file system sont probablement plus couteux en temps d'exécution que le test d'un flag.
A+,
Message édité par gilou le 25-08-2015 à 22:12:56
---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --