如何在Perl中读取.csv文件以仅获取必填字段,执行一些操作并将结果写回到同一文件?

时间:2019-05-29 14:01:33

标签: perl

我有一个CSV文件,其中包含 IP(有效)字段,如下所示:

ip, alive
127.0.0.1, Yes
127.0.0.2, No

我想ping每个IP,如果ping可达,那么我需要在同一CSV文件中的IP前面加上Yes。
我正在尝试使用下面的代码,但只能读取和写入相同的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";
}

我用于ping和读取文件的代码可以正常工作,但是我不确定要遍历从文件读取的数据,然后ping并将结果存储回CSV文件。
任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

npx create-react-app

答案 1 :(得分:-1)

我认为这可以满足您的要求

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

答案 2 :(得分:-1)

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

my $file = 'servers.csv';
my @filedata;
my $p = Net::Ping->new();

open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
while (my $line = <$fh>) {
    chomp $line;
    my @fields = split(/,/, $line);
    unless ($. == 1) { #ignore the header row
        $fields[1] = $p->ping($fields[0]) ? " Yes": " No";
    }
    push @filedata, \@fields;
}

close($fh);

open( $fh, '>', $file) or die "Can't read file '$file' [$!]\n";
print $fh join(",", @$_) . "\n" for @filedata;

原位编辑可能会出错,请保留servers.csv文件的备份。