Как прочитать файл .csv в Perl, чтобы получить только обязательные поля, выполнить некоторые операции и записать результаты в тот же файл? - PullRequest
1 голос
/ 29 мая 2019

У меня есть CSV-файл, который содержит IP, Alive поля, как показано ниже:

ip, alive
127.0.0.1, Yes
127.0.0.2, No

Я хочу пропинговать каждый IP, и если пинг доступен, тогда мне нужно поставить Да перед этим IP в том же файле CSV.
Я пытаюсь с кодом ниже, но застрял при чтении и записи одного и того же файла CSV.

#!/usr/bin/perl
use strict;
use warnings;
use Net::Ping;
use Data::Dumper;

my $file = 'servers.csv';
my @filedata;
open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
while (my $line = <$fh>) {
    chomp $line;
    my @fields = split(/,/, $line);
    push @filedata, \@fields;
}
print Dumper(@filedata);    

my $p = Net::Ping->new();

if ($p->ping('127.0.0.1'))
{
   print "\nYes\n";
}

Мой код для проверки и чтения файла работает нормально, но я не очень уверен насчет циклического прохождения данных, прочитанных из файла, а затем проверяю и сохраняю результат обратно в файл CSV.
Любая помощь будет высоко оценена.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019
use Tie::Array::CSV qw();
tie my @file, 'Tie::Array::CSV', 'servers.csv';

for my $server (@file) {
    next if 'ip' eq $server->[0]; # skip table header
    my $ping_result = rand > 0.5 ? 'Yes' : 'No'; # fake ping
    $server->[1] = $ping_result; # update file
}
0 голосов
/ 29 мая 2019

Я думаю, что это то, что вы хотите:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Ping;
use Data::Dumper;
use File::Copy;

my $file = 'servers.csv';
my $fileOut = 'serversOut.csv';

my @filedata;
open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
open(my $fhOut, '>', $fileOut) or die "Can't read file '$fileOut' [$!]\n";
while (my $line = <$fh>) {
    chomp $line;
    my @fields = split(/,/, $line);

    my $p = Net::Ping->new();
    if($fields[0] eq 'ip') {
        print "Header $fields[0]\n";
        print $fhOut 'ping, ' . $line . "\n";
        next;
    }
    if ($p->ping($fields[0])) {
        print "Pinging $fields[0] - yes\n";
        print $fhOut 'Yes, ' . $line . "\n";
    }
    else {      
        print "Pinging $fields[0] - no\n";
        print $fhOut 'No, ' . $line . "\n";
    }
}
close $fh;
close $fhOut;   

move($fileOut, $file) or die "Can't move '$fileOut' file '$file' [$!]\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...