Déjà, quelques erreurs:
open(OUTPORT ,">$where/$spreadsheet") || die "ERROR: the file $file_name found\n";
Tu essaies d'ouvrir $spreadsheet et ton message d'erreur concerne $file_name.
Même chose à la ligne suivante.
Cela n'est pas faux, mais ce n'est pas forcément une bonne idée de "slurper" un fichier entier en mémoire dans un tableau. Si ton fichier fait 15 gigaoctets, tu vas exploser ta mémoire. Mieux vaut lire le fichier ligne à ligne et traiter chacune individuellement.
De plus, ça t'oblige a parcourir ensuite ton tableau. Si tu veux vraiment le faire comme ça, un "foreach my $line (@lines)" serait bien mieux qu'un truc du genre "for ($i=O, $i < ..., $i++)", mais il y a en fait bien plus simple (voir plus bas).
1 2 3 4 5 6 7
| if ($file[$i] =~ /^Ports$/i)
{
$ports=shift (@file);
push (@ports,$ports);
}
next if ($file[$i] =~ /^Endpoint$/i);
} |
Outre le fait que tu dupliques une deuxième fois tes données en mémoire (ce qui n'est pas utile), ce code ne fait pas du tout ce que tu veux.
Ce que tu veux:
- Lire les lignes tant que je ne suis pas arrivé à Ports (il a peut-être d'autres choses avant)
- sauter la ligne suivante (soulignement)
- lire les lignes suivantes tant que je ne suis pas arrivé à end point et les copier dans mon premier fichier de résultat
- répéter ce qui précède pour les données suivantes jusqu'à clockpin avec le fichier suivant
- répéter encore pour les données après clockpin.
Cela peut donner quelque chose comme cela:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| open(FILE,"<$SEARCH_PATH/$file_name") || die "ERROR: the file $file_name not found\n";
open(OUT ,">$where/$spreadsheet") || die "ERROR: unable to create $spreadsheet \n";
while (<FILE>) {
# elimination de lignes éventuelles avant "Ports"
last if /Ports/;
}
next; #on est arrivé à Ports, on élimine la ligne suivante, le soulignement)
# on reprend la lecture, on va lire maintenant les ports
while (<FILE>) {
chomp;
if (/Endpoint/) {
# je suis arrivé à Endpoint, je ferme le fichier des ports et ouvre le fichier suivant
#en gardant le même handle, comme ça j'écrirais toujours dans le même handle, mais ce sera un fichier différent
close OUT;
open(OUT ,">$where/$spreadsheet2") || die "ERROR: unable to open $spreadsheet2 \n" ;
next; # passage à la ligne suivante
}
if (/clockpin/) {
... fermeture du fichier 2 et ouverture du fichier 3, comme ci-dessus
}
# maintenant je peux écrire dans OUT toutes les lignes que je rencontre en entrée,
#car le file handler OUT pointe à tout moment vers le fichier voulu
# (sauf les lignes contenant "====================")
print OUT "$_ \n" unless /^=+$/;
} |
Probablement deux fois moins de ligne de code pour arriver au résultat, exécution sans aucun doute bien plus rapide (emplir un tableau pour le copier et ensuite lire la copie consomme des ressources inutilement), pas de risque de saturer la mémoire. Là, je me contente de lire les lignes une à une et de les copier dans le fichier de sortie. Avec juste un peu de code pour changer de fichier de sortie quand c'est nécessaire.
Partager