Script Perl pour eclater un fichier CSV


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /homepages/31/d249765410/htdocs/vlasic2/wp-content/plugins/wp-code-highlight/wp-code-highlight.php on line 68

Problème posé:

J’ai un fichier CSV de plus de 10000 lignes qui recense les différentes espèces de la flore française.

je rappelle qu’un CSV Comma-separated values)est un format informatique ouvert représentant des données tabulaires sous forme de valeurs séparées par des virgules ou des points-virgule ou ce que vous voulez.. sa représentation la plus connue est sous la forme d’un tableau Excel ou Scalc. C’est à dire que ces logiciels interprètent le CSV comme un tableau.

Ici chaque ligne possède 1 terme: le nom scientifique:

Acanthus mollis
Acanthus spinosa
Acorus calamus
Actinidia chinensis

Les scientifiques auraient besoin de la même liste mais il faudrait dissocier du nom scientifique,  le genre de l’espèce. Or il se trouve que le genre est une composante du nom scientifique: Nom scientifique = Genre + espèce.

c’est donc le premier mot du terme.

exemple: la plante Acanthus mollis à pour Genre Acanthus…

Solution: traitement par un script Perl

Il n’y aurait que 4 lignes à traiter, il suffirait de s’amuser à faire du copier/coller. Il se trouve ici que notre fichier possède plus de 10000 lignes et qu’on n’a pas 3 jours mais bien 5 minutes… La science n’attend pas.

Il faut donc créer un script qui parcourrait toutes les lignes du fichier et qui appliquerait le même traitement à chaque ligne du fichier… tant qu’il y a des lignes…

Contenu du script eclatelefichier.pl:

#!/usr/bin/perl -w
use strict;
use utf8;

open FILE, ">> nomsscientifiques" or die "Le fichier n'existe pas !\n";

open WRITER, ">> ../travail_sur_plantes/famille_taxon_plantes/genresespeces.csv" or die "ya comme un probleme !\n";

my $genre;
my $espece;

while (my $line = <FILE>){
chomp($line);
$genre = $line;
$genre=~/^((\S+)\s\S+)/;
$genre= $2;
$espece= $1;
print WRITER "$genre,$espece\n"
}
close FILE

En analysant le script on voit que Perl manipule 2 fichiers

le premier est le fichier source comportant les noms scientifiques et ayant pour nom:

nomsscientifiques.csv

(NB vous pourriez bien l’appeler nomsscientifiques.tartempion l’avantage de Perl (sous Linux ou Apple) est qu’il s’absout de l’analyse des extensions de fichiers, il attaque le problème directement dans le contenu…

Ce fichier est donc ouvert en lecture par la ligne:

open FILE, "> nomsscientifiques" or die "Le fichier n'existe pas !\n";

Cette ligne propose d’ailleurs un message d’erreur si le fichier n’est pas trouvé.

Le script va ensuite préparer un fichier en écriture pour y insérer ultérieurement le résultat de son traitement: le fichier genresespeces.csv

open WRITER, ">> ../travail_sur_plantes/famille_taxon_plantes/genresespeces.csv" or die "ya comme un probleme !\n";

Vous pouvez d’ailleurs voir que vous pouvez contrôler l’emplacement de ce fichier et aussi proposer une action en cas de plantage du script, ici vous dire qu’il y a un problème…

Ensuite le script va lire toutes les lignes jusqu’à la dernière:

while (my $line = <FILE>){

Puis il va supprimer les « retour chariot » qui peuvent perturber l’éxecution:

chomp($line);

Ensuite le script va décomposer chaque ligne type  en utilisant les expressions rationnelles qui permettent de manipuler le texte dans tous les sens… Ici la ligne est décomposée en 2 blocs entre parenthèses…:

$genre = $line;
$genre=~/^((\S+)\s\S+)/;
$genre= $2;
$espece= $1;

Ensuite il ne reste plus qu’à réécrire la ligne en la recomposant avec les blocs obtenus, toujours au sein de la boucle bien sur et de l’inscrire dans le fichier ouvert en écriture:

print WRITER "$genre,$espece\n";

N’oublions pas de fermer la boucle et les fichiers:

close FILE

Ce contenu a été publié dans perl, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire