Разбор файла в массив - PullRequest
       0

Разбор файла в массив

0 голосов
/ 19 октября 2010

Я действительно новичок в Perl, но я хочу в основном прочитать файл, чтобы получить из него некоторые данные. Я хочу проанализировать эти данные в массив. Почему массив? Потому что я хочу использовать данные для создания графика (гистограмма или круговая диаграмма данных).

Вот мой код для Perl:

#!/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";
}

Вот файл, в котором я читаю (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% 

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

Однако, что я заметил, это то, что я успешно заполнил массив, но он не разделяет вкладки и не дает мне многомерный массив. Меня не волнует поле времени CPU, но я хочу использовать CPU, поэтому я хочу напечатать XY-диаграмму с осью Y, в которой указана загрузка процессора, а по оси x - имя процесса.

Я надеялся получить массив "cpu_util" и иметь cpu_util [0] [0] = System и cpu_util [0] [1] = 3,00. Это вообще возможно? Я думал, что раскол / \ / t \ ​​позаботится об этом, но, видимо, я ошибся ...

Ответы [ 2 ]

6 голосов
/ 19 октября 2010

Я думаю, что вы хотите хэш там.Ключом будет имя процессора, а значением будет процент использования.Ты почти там.После успешного совпадения используйте перехваты ($1 и $2), чтобы заполнить хеш:

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 );

Ваша структура данных должна быть намного проще в использовании:* Ваш split , вероятно, не работает, потому что там нет вкладок.Во всяком случае, это не тот путь.

0 голосов
/ 19 октября 2010

Вот ваш код исправленный 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';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...