Bonjour,
Tout d'abord j'utilise:
Perl 5.10, Toad 4.1 & MySQL 5.1
Ce que je souhaite réaliser:
1. Concaténer tous les fichiers *.csv* d'un répertoire en un seul et même fichier
2. De supprimer toutes les lignes vides
3. Mettre tout ça dans un tableau et supprimer la colonne 2,8,9,10 & 11
4. Trier par la première colonne
5. Supprimer toutes les lignes en doublons
6. Remplacer tous les caractères " par rien
7. D'ajouter en dernière colonne les 3 premiers caractères de la colonne 3 (TEL, PRP etc...)
8. Sur cette dernière colonne, remplacer tous les INA, INJ & INR par INT
9. Insérer en début de ligne insert into zz_billing values("
10. D'insérer en fin de ligne ");
11. De remplacer le délimiteur ; par ","
12. Renommer le fichier de sorti en .sql
Exemple de fichier d'entré:
Le résultat souhaité:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 245362;77;77289;INR69907;Feutre;799;20091102232406;;VEL;799;66;24; 243640;77;66017;INT81553;"Cahier";699;20091102232318;;VEL;699;66;24; 236958;77;08;DRT03286;Lit;299;20091102231945;;VEL;299;66;15; 319771;77;79060;INA38898;Stylo;399;20091102231902;;VEL;399;66;3; 319771;77;79060;BTQ38898;Stylo;399;20091102231902;;VEL;399;66;24; 319250;77;13110;INJ40768;Matelas;599;20091102231736;;VEL;599;66;24; 320343;77;21758;PRP31628;Souris;299;20091102231459;;VEL;299;66;24; 331379;77;27209;INT59377;Trousse;299;20091102231319;;VEL;299;66;15; 314147;77;89301;BTQ12922;Ciseau;0;20091102231248;;VEL;0;66;24; 334467;77;26234;TEL38873;Mouchoir;499;20091102231131;;VEL;499;66;24; 241749;77;37732;TEL90191;Effaceur;699;20091102231104;;VEL;699;66;24;
Je débute en perl et pour le moment mon script est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 insert into zz_billing values("236958","8","DRT03286","Lit","299","20091102231945","15","DRT"); insert into zz_billing values("241749","37732","TEL90191","Effaceur","699","20091102231104","24","TEL"); insert into zz_billing values("243640","66017","INT81553","Cahier","699","20091102232318","24","INT"); insert into zz_billing values("245362","77289","INR69907","Feutre","799","20091102232406","24","INT"); insert into zz_billing values("314147","89301","BTQ12922","Ciseau","0","20091102231248","24","BTQ"); insert into zz_billing values("319250","13110","INJ40768","Matelas","599","20091102231736","24","INT"); insert into zz_billing values("319771","79060","BTQ38898","Stylo","399","20091102231902","24","BTQ"); insert into zz_billing values("319771","79060","INA38898","Stylo","399","20091102231902","3","INT"); insert into zz_billing values("320343","21758","PRP31628","Souris","299","20091102231459","24","PRP"); insert into zz_billing values("331379","27209","INT59377","Trousse","299","20091102231319","15","INT"); insert into zz_billing values("334467","26234","TEL38873","Mouchoir","499","20091102231131","24","TEL");
J'arrive donc à un résultat plutôt satisfaisant, il me manque en revanche l'étape 4 & 5.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #!/usr/bin/perl -w use strict; use warnings; # ************************************************************ # Global Variables my $LOCAL_DIR = "/cygdrive/d/_.billing/_.compiler/backup/test/"; my $DEST_DIR = "/cygdrive/d/_.billing/_.compiler/backup/"; my $SEARCH_FILE = "*_billing_*"; my $OUTPUT_FILE = $DEST_DIR . sprintf("RESULT_FILE.SQL"); my $START_SEP = 'insert into zz_billing values("'; my $SEP = '","'; my $END_SEP = '");'; # ************************************************************ # Script Perl print "Starting...\n"; print "\n"; # ************************************************************ open (OUT,">$OUTPUT_FILE") or die "Message : $!\n"; my @RESULT_FILE = <$LOCAL_DIR$SEARCH_FILE>; foreach my $LINE(@RESULT_FILE) { open IN,"$LINE" or warn "Message : $!\n"; while(<IN>) { s/\"//g; #" next if m/^$/; my @SPLIT_TAB = split(/;+/); push(@SPLIT_TAB,substr($SPLIT_TAB[3],0,3)); chomp(@SPLIT_TAB); $SPLIT_TAB[11] =~ s/INA|INJ|INS/INR/; print OUT "$START_SEP$SPLIT_TAB[0]$SEP$SPLIT_TAB[2]$SEP$SPLIT_TAB[3]$SEP$SPLIT_TAB[4]$SEP$SPLIT_TAB[5]$SEP$SPLIT_TAB[6]$SEP$SPLIT_TAB[10]$SEP$SPLIT_TAB[11]$END_SEP\n"; #print OUT $_; } } # ************************************************************ # Ending... print "\n"; print "Ending...\n"; END # End. # ************************************************************
4. Trier par la première colonne
5. Supprimer toutes les lignes en doublons
Je ne peux pas le faire pendant le foreach car c'est à mon sens un traitement ligne par ligne donc il n'a pas encore toutes les données pour faire un tri.
Il faut donc à mon avis le faire dans un second temps dans un autre fichier de sorti.
C'est là que je bloque car je n'arrive tout bonnement pas à récupérer ce que j'ai fais pour effectuer le sort dans un second tableau.
Puis pour le tri sans doublons j'ai croisé sur le net des choses avec table de hashage mais je n'y suis pas arrivé.
Merci d'avance pour votre aide,
++
Partager