2010-10-18 5 views
0

Je suis vraiment nouveau à Perl, mais je veux lire un fichier pour en extraire des données. Je veux analyser ces données dans un tableau. Pourquoi un tableau? Parce que, je veux utiliser les données pour générer un graphique (barre ou tarte des données).Analyser un fichier dans un tableau

Voici mon code pour Perl jusqu'à présent:

#!/usr/bin/perl -w 
use warnings; 

#Creating an array 
my @cpu_util; 

#Creating a test file to read data from 
my $file = "test.txt";  
#Opening the while  
open(DATA, $file) || die "Can't open $file: $!\n"; 

#Looping through the end of the file 
while (<DATA>) 
{ 
if (/(\w+)\s+\d+\s+(\d+)\.(\d+)\%/){ #Getting only the "processes" 
chomp; 
push @cpu_util, split /\t/; #I was hoping this would split the data at the tabs 
} 
} 

close ($file); 

foreach $value (@cpu_util) { 
print $value . "\n"; 
} 

Voici le fichier que je lis dans (test.txt):

========================================= 

CPU Utilization 

========================================= 

Name  CPU Time  CPU Usage  

----------------------------------------- 

System    7962   3.00% 

Adobe Photoshop  6783   0.19% 

MSN Messenger   4490   0.01% 

Google Chrome   8783   0.02% 

Idle     120  94.00% 

========================================= 

Cependant, ce que je remarque est que je remplir avec succès le tableau, mais il ne divise pas les onglets et me donne un tableau multidimensionnel. Je ne me soucie pas vraiment du champ de temps CPU, mais je veux l'utilisation du processeur, donc je veux imprimer un diagramme XY avec l'axe Y ayant l'utilisation du processeur et l'axe des x, le nom du processus.

J'espérais avoir un tableau "cpu_util" et avoir cpu_util [0] [0] = System et cpu_util [0] [1] = 3.00. Est-ce seulement possible? Je pensais que le split/\/t \ ​​s'en occuperait, mais apparemment je me suis trompé ...

Répondre

6

Je pense que vous voulez un hachage là-bas. La clé serait le nom de la CPU et la valeur serait le pourcentage d'utilisation. Tu y es presque. Après un match réussi, utilisez les captures ($1 et $2) pour alimenter le hachage:

my %cpu_util; 
while (<DATA>) 
    { 
    if (/(.*?)\s+\d+\s+(\d+\.\d+)\%/){ #Getting only the "processes" 
     $cpu_util{ $1 } = $2; 
     } 
    } 

use Data::Dumper; 
print Dumper(\%cpu_util); 

Votre structure de données devrait être beaucoup plus facile à utiliser alors:

$VAR1 = { 
      'Google Chrome' => '0.02', 
      'System' => '3.00', 
      'Adobe Photoshop' => '0.19', 
      'Idle' => '94.00', 
      'MSN Messenger' => '0.01' 
     }; 

Votre split ne fonctionnera probablement pas parce qu'il n'y a pas d'onglets là-bas. Ce n'est pas vraiment le chemin à parcourir de toute façon.

+0

Merci Brian, cela a fait l'affaire. Je vais maintenant essayer de regarder, comment représenter graphiquement ces données. J'ai examiné l'utilisation de Perl en $ 1 et $ 2, mais cela n'a toujours pas beaucoup de sens pour moi. Pourriez-vous peut-être me diriger vers un endroit où cela s'explique bien? Je ne comprends pas ce qui se passe exactement à: > $ cpu_util {$ 1} = $ 2; – c0d3rs

+0

_Learning Perl_ est un bon point de départ. :) –

-1

Voici votre code fixe ihateme:

use Data::Dumper; 
#use strict; 

#Creating an array 
my @cpu_util; 

#Creating a test file to read data from 
my $file = "bar.txt"; 
#Opening the while 
open(DATA, $file) || die "Can't open $file: $!\n"; 

#Looping through the end of the file 
while (<DATA>) 
{ 
    if (/(\w+)\s+\d+\s+(\d+)\.(\d+)\%/) 
    { 
    chomp; 
    my ($name, $cpuusage, @rest ) = split (/\s+\d+\s+(\d+\.\d+)\%/); 
    push @cpu_util, [$name, $cpuusage ]; 
    } 

} 
close $file; 

print Dumper(\@cpu_util); 
$ref = $cpu_util[0]; # this will set the reference to the first array 
$ref -> [2]; # this will return the 3rd value 
print Dumper ($ref -> [1]); 


$VAR1 = [ 
     [ 
     'System', 
     '3.00' 
     ], 
     [ 
     'Adobe Photoshop', 
     '0.19' 
     ], 
     [ 
     'MSN Messenger', 
     '0.01' 
     ], 
     [ 
     'Google Chrome', 
     '0.02' 
     ], 
     [ 
     'Idle', 
     '94.00' 
     ] 
    ]; 

$ VAR1 = '3.00';

+0

Vous faites un peu trop de travail là-bas. Vous avez vraiment besoin d'un seul match. Prenez les choses dont vous avez besoin dans le premier match pour ne pas avoir à faire la seconde. –

Questions connexes