La variable $number n'est apparemment pas initialisée, c'est sans doute assez facile à corriger, mais je peux pas dire grand chose de plus sans voir ton code.
Version imprimable
La variable $number n'est apparemment pas initialisée, c'est sans doute assez facile à corriger, mais je peux pas dire grand chose de plus sans voir ton code.
Hello,
Je pense avoir corrigé le soucis.
Mais maintenant, j'obtiens un résultat nul ...
Voici le code :
Voici le résultat :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 use strict; use warnings; my %count; my $fichier = "SVTEST.txt"; my $number=0.0; open my $FH, "<", $fichier or die "Ouverture impossible du fichier $fichier"; <$FH> for 1..11; while (my $line = <$FH>) { my ($name, $capacity) = (split /:/, $line)[1, 7]; if ($name =~ /VMware/xmsi or $name =~ /SRV/) { $count{vm} += $number; } elsif ($name =~ /OR/) { $count{oracle} += $number; } elsif ($name =~ /sql/) { $count{sql} += $number; } } print "Capacity for $_ = $count{$_} TB\n" for keys %count;
Code:
1
2 Capacity for vm = 0 TB Capacity for oracle = 0 TB
Bonjour,
tu as oublié quelques lignes de code, en particulier celle où $number est initialisé à partir de $capacity et recalculé en TB si on a des GB.
Du coup, $number est toujours à 0.
Code:
1
2
3
4
5
6 my ($name, $capacity) = (split /:/, $line)[1, 7]; my ($number,$type) = ($capacity =~ m{\A \s* ([\d.]+) \s* ([A-Z]+) \s* \z}xms); next unless defined $number; # print "$number $type \n"; #Pour test $number = $number / 1000.0 if $type eq 'GB'; #Convertis en TB si le type est GB
Bonjour Lolo,
Désolé poru autant de temps sans retour de ma part mais j'ai du mettre ce projet de côté pour d'autre projet plus important!
Je ne comprends pas trop où dois-je ajouter l'information ? J'ai effectivement maintenant un output avec des chiffres, mais je penses que c'est faussé niveau résultat (petit édit, je vais vérifier manuellement, mais ça à l'air d'aller en fait).
Petite question, comment dois-je faire, si par exemple, il existe une lignequi ne correspond à rien (donc dans ce cas ni VMware, SRV, OR, SQL) et créer une catégorie "Other" ?Code:
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 use strict; use warnings; my %count; my $fichier = "SVTEST.txt"; my $number=0; open my $FH, "<", $fichier or die "Ouverture impossible du fichier $fichier"; <$FH> for 1..11; while (my $line = <$FH>) { my ($name, $capacity) = (split /:/, $line)[1, 7]; my ($number,$type) = ($capacity =~ m{\A \s* ([\d.]+) \s* ([A-Z]+) \s* \z}xms); next unless defined $number; # print "$number $type \n"; #Pour test $number = $number / 1000.0 if $type eq 'GB'; #Convertis en TB si le type est GB if ($name =~ /VMware/xmsi or $name =~ /SRV/xmsi) { $count{vm} += $number; } elsif ($name =~ /OR/xmsi) { $count{oracle} += $number; } elsif ($name =~ /SQL/xmsi) { $count{sql} += $number; } } print "Capacity for $_ = $count{$_} TB\n" for keys %count;
Je vais avoir un petit cours personnalisé demain, donc je serai moins idiot sur Perl :P
Mais un peu d'aide n'est pas contre!
Bonjour,
je n'ai pas relu tout les détails, mais sans doute quelque chose dans ce genre:
Code:
1
2
3
4
5
6
7
8
9
10
11 if ($name =~ /VMware/xmsi or $name =~ /SRV/xmsi) { $count{vm} += $number; } elsif ($name =~ /OR/xmsi) { $count{oracle} += $number; } elsif ($name =~ /SQL/xmsi) { $count{sql} += $number; } else { $count{other} += $number; } }
Hello Lolo,
Merci mais entre temps j'ai trouvé !
Désolé de poser des questions idiotes :(
Petite question, comment je peux faire un affichage par ordre alphabétique sur le résultat que j'ai?Code:print "Capacity for $_ = $count{$_} TB\n" for keys %count;
Je pense que c'est la commande "Sort" mais je ne vois pas où la placer ?
Tant mieux. :)
C'est très simple. Je te laisse chercher, peut-être que tu vas trouver aussi, non? :aie: :ptdr:
Bon, je plaisantais. Plus sérieusement, tu veux trier selon les clefs du hachage? ou autre chose?
Si c'est sur les clefs, ça peut être aussi simple que:
Code:print "Capacity for $_ = $count{$_} TB\n" for sort keys %count;
C'est exactement ça merci !
J'avais trouvé "sort" mais je ne me souviens plus où je l'avais placé pour que cela ne fonctionne pas ... surement avant %count et non avant Keys ... Ce qui est idiot une fois qu'on réfléchis au fonctionnement de "Keys" ...
Lolo,
Je me demandais si il était possible de changer la façon dont on commence la lecture du fichier ?
Effectivement, pour le moment on lui dit de commencer vraiment à 11.
Pour le moment, les fichiers sont toujours composé de la même façon, mais si jour une ligne de plus se rajoute, je recevrai un message d'erreur.
Existe t-'il un moyen, de dire par exemple, si tu vois "id:name:IO_group.........." commence à lire ?
Petit rappel du contenu du fichier que je traite :
La 11eme ligne étant celle qui commence par "id:name:...."Citation:
Command to execute : svcinfo lsmdiskgrp -delim : :
--------------------------------------------------
id:name:status:mdisk_count:vdisk_count:capacity:extent_size:free_capacity:virtual_capacity:used_capacity:real_capacity:overallocation:warning:easy_tier:easy_tier_status:compression_active:compression_virtual_capacity:compression_compressed_capacity:compression_uncompressed_capacity:parent_mdisk_grp_id:parent_mdisk_grp_name:child_mdisk_grp_count:child_mdisk_grp_capacity:type:encrypt:owner_type:site_id:site_name
0:NBB2_CORP_DS8K8:online:38:297:124.98TB:1024:7.54TB:117.44TB:117.43TB:117.43TB:93:90:on:active:yes:5.00GB:3.28MB:0.00MB:0:NBB2_CORP_DS8K8:0:0.00MB:parent:no:none::
1:MigrationPool_8192:online:0:0:0:1024:0:0.00MB:0.00MB:0.00MB:0:80:auto:balanced:no:0.00MB:0.00MB:0.00MB:1:MigrationPool_8192:0:0.00MB:parent::none::
RC = 0
Command to execute : svcinfo lsvdisk -delim : :
-----------------------------------------------
id:name:IO_group_id:IO_group_name:status:mdisk_grp_id:mdisk_grp_name:capacity:type:FC_id:FC_name:RC_id:RC_name:vdisk_UID:fc_map_count:copy_count:fast_write_state:se_copy_count:RC_change:compressed_copy_count:parent_mdisk_grp_id:parent_mdisk_grp_name:formatting:encrypt:volume_id:volume_name:function
0:V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM:1:IO_GRP1:online:0:NBB2_CORP_DS8K8:75.00GB:striped:::::600507680181865A7800000000000398:0:1:not_empty:0:no:0:0:NBB2_CORP_DS8K8:no:no:0:V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM:
Merci !
Bonjour,
il y a de nombreuses façons de faire cela. En voici une (qui devrait marcher, mais non testée sur mon téléphone):
Code:
1
2
3
4
5
6
7 my $saute = 1; while (my $line = <$FH>) { $saute = 0 if $line =~ /^id:name:IO_group_id:/; next if $saute; # suite du traitement de la $ligne #...
Salut Lolo,
Merci, ça fonctionne parfaitement.
J'essaye de comprendre ton code, corrige moi avec plaisir stp :)
Tu déclares $saut à 1Code:
1
2
3
4
5 my $saut = 1; while (my $line = <$FH>) { $saut = 0 if $line =~ /^id:name:IO_group_id:/; next if $saut;
Il parcourt le fichier par ligne
$saut devient 0 si la ligne commence par "id:name:IO_group_id:"
Il skip la ligne tant que $saut = 1, dés qu'il devient 0, il commence le trainement des lignes
J'ai bon ? Ou je suis idiot ? :aie:
Oui, tu as parfaitement compris. Implicitement une valeur 1 est vraie et une valeur 0 est fausse.
Salut Lolo
J'ai une question plutôt de réflexion, peut-être pourras-tu m'aider ...
J'effectue ce test :
Pour récupérer les Oracles. J'avais utilisé au début "OR" car cela est présent dans les lignes Oracle.Code:
1
2 elsif ($name =~ /OR/xmsi) { $count{Oracle} += $number;
Par contre j'ai un autre soucis, des fois le mot "CORP" apparaît et du coup, cela les comptes aussi dans les Oracles ..
As-tu une idée ?
Voici des exemples de ligne :
Citation:
0:V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM:1:IO_GRP1:online:0:NBB2_CORP_DS8K8:75.00GB:striped:::::600507680181865A7800000000000398:0:1:not_empty:0:no:0:0:NBB2_CORP_DS8K8:no:no:0:V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM:
Citation:
1:V_SVCC_NBB2_SWPNCNDATP01_G_0001_AU:1:IO_GRP1:online:4:NBB2_CORP_NRLSAS_STW22:2.00TB:striped:::1:rcrel0:600507680181865A7800000000000399:0:1:empty:0:no:0:4:NBB2_CORP_NRLSAS_STW22:no:no:1:V_SVCC_NBB2_SWPNCNDATP01_G_0001_AU:aux
Bonjour,
dans ce cas, il faut rechercher un motif un peu plus discriminant que simplement /OR/. Je ne connais pas tes données en entrée, mais, d'après ce que j'en vois, il est possible que la recherche de /_OR/ ou /OR\d/ (OR suivi d'au moins un chiffre) puisse suffire. A toi de voir selon ce qui permet d'identifier dans ton fichier en entrée une chaîne correspondant à Oracle et pas à autre chose.
Salut Lolo,
Merci pour ton analyse.
J'ai repris le /OR\d/ et j'ai retravaillé un peu tout ça.
J'ai une petite question, j'aimerai travailler un peu avec Excel avec mes résultats obtenu.
J'ai trouvé sur internet ceci pour travailler avec un Excel :
J'aimerai dans un premier temps insérer les informations dans un Excel et puis faire du traitement avec (exemple : générer un pourcentage, générer un graph, etc..) penses-tu que cela est possible ?Code:$worksheet->write
Avec le Perl de base, je ne souhaite pas utiliser de module supplémentaire.
Je n'arrête pas mes recherches, mais si je ne trouve pas tu pourras peut-être m'aiguiller :)
Edit : Bon générer des pourcentages, etc ne devrait pas être trop difficile, j'ai vu qu'on pouvait réaliser des formules depuis Perl. J'ai également trouver comment écrire une variable dans une case, ne me reste plus qu'a faire tout ça automatiquement au lieu d'écrire à chaque foisEdit 2 : En gros j'aimerai arriver à +/- ce résultat je pense, mais sans devoir taper (enfin, peut-être que c'est mieux que je tape en fait, ça m'évite de chercher et ça fonctionne ..., qu'en penses-tu ?)Code:$worksheet->write("A1","Capacity for SQL : $count{SQL} TB");
MerciCode:
1
2
3
4
5 $worksheet->write("A1","Capacity for SQL :"); $worksheet->write("A2","$count{SQL} TB"); $worksheet->write("B1","Capacity for Oracle :"); $worksheet->write("B2","$count{Oracle} TB");
Ben ce n'est pas trop possible (ou, du moins, c'est vraiment très difficile) sans utiliser de module supplémentaire, je pense qu'il faut vraiment passer par un module externe.
La syntaxe que tu cites:
provient manifestement d'un module Perl pour écrire des fichiers Excel, probablement celui-ci: http://search.cpan.org/~jmcnamara/Sp.../WriteExcel.pm. Voici des exemples tirés de la doc de ce module:Code:$worksheet->write
En revanche, si le but est seulement de calculer des pourcentages, tu peux très bien le faire en Perl pur, sans module externe et sans utiliser Excel.Code:
1
2
3
4
5
6
7
8
9 # Write a formatted and unformatted string, row and column notation. $col = $row = 0; $worksheet->write($row, $col, 'Hi Excel!', $format); $worksheet->write(1, $col, 'Hi Excel!'); # Write a number and a formula using A1 notation $worksheet->write('A3', 1.2345); $worksheet->write('A4', '=SIN(PI()/4)');
A vrai dire, il existe bien une solution (très limitée) pour créer un fichier Excel sans module: créer un fichier de type CSV (comma separated values), dans lequel les champs de la future feuille sont séparés par des virgules. Si l'extension du fichier est ".cvs", alors Excel pourra l'ouvrir et le convertir en fichier Excel. Mais je ne recommande vraiment pas cette solution, car elle implique une conversion manuelle en utilisant Excel, et il n'est pas évident que les formules fonctionnent.
Hello,
En fait quand je disais "ne pas utiliser de module", je parlais d'utiliser uniquement ceux installé dans le package Perl de base.
En fait le but était plutôt d'insérer les valeurs dans un fichier Excel, en sortir deux trois données et si possible créer un graphique avec :)
Pour le moment ça ressemble à ça ce que j'ai fais :
Pour obtenir ça :Code:
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 use Excel::Writer::XLSX; use Spreadsheet::WriteExcel; my $workbook = Excel::Writer::XLSX->new('test.xlsx') ; my $worksheet = $workbook->add_worksheet('Data'); my $chart = $workbook->add_chart(type=>'column'); my $bold = $workbook->add_format(bold => 1); #For titles $chart->add_series( name => '=Data!$A$2', values => '=Data!$B$2'); $chart->add_series( name => '=Data!$A$3', values => '=Data!$B$3'); $chart->set_title(name => 'SVC'); $chart->set_x_axis(name => 'System'); $chart->set_y_axis(name => 'Capacity (Terabytes)'); #For Titles of EXCEL my $format = $workbook->add_format( border => 6, valign => 'vcenter', align => 'center', size => 18, bold => 1, ); $worksheet->merge_range('A1:F1', 'Capacity by types (Terabytes)', $format); $worksheet->write("A2","SQL", $bold); $worksheet->write("B2","$count{SQL}"); $worksheet->write("A3","Oracle", $bold); $worksheet->write("B3","$count{Oracle}"); $workbook->close;
Pièce jointe 335100
Pièce jointe 335106
Seul défaut je dois tout taper à la main. As-tu une meilleure façon de faire ?
Que veux-tu dire pas "tout taper à la main"? Ça paraît fait automatiquement dans le module.
Désolé, j'ai un peu de mal à décrire ce que je souhaite.
Mais en gros, c'est éviter d'écrire ceci dans le script :
Voir si il n'est pas possible de une sorte de boucle "automatique", je ne sais pas si tu vois ce que je veux dire ?Code:
1
2
3
4
5
6 $chart->add_series( name => '=Data!$A$2', values => '=Data!$B$2'); $worksheet->write("A2","SQL", $bold); $worksheet->write("B2","$count{SQL}");
Comme pour ça :
Code:print "Capacity for $_ = $count{$_} TB\n" for sort keys %count;