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

如何在Perl中读取.csv文件以仅获取所需字段,执行一些操作并将结果写回同一文件?,perl,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';

我有一个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";
}
#/usr/bin/perl
严格使用;
使用警告;
使用Net::Ping;
使用数据::转储程序;
my$file='servers.csv';
我的@filedata;

打开(我的$fh,”我想这就是你想要的:

#!/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";
!/usr/bin/perl
严格使用;
使用警告;
使用Net::Ping;
使用数据::转储程序;
使用文件::复制;
my$file='servers.csv';
my$fileOut='serversOut.csv';
我的@filedata;

打开(我的$fh,'是否需要与您读取的文件相同?要么将内容存储在内存中,完成时写入,要么写入另一个文件,完成后复制到原始文件上。@Unixmonkey,是的。因为我的源文件太大,并且将整个文件的内容存储在内存中对系统效率不高。我通常使用,尽管我相信这会将文件的内容加载到内存中。而且,通常情况下,这是有效的,即使是数百MB。@Tanktalus,您能以答案的形式帮助我编写代码吗?服务器上是否安装了Text::csvxs模块?错误如下:无法在@INC中找到Tie/Array/CSV.pm(@INC包含:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor\u perl/usr/share/perl5/vendor\u perl/usr/lib64/perl5/usr/share/perl5。)在test2.pl第1行。BEGIN失败——编译在test2.pl第1行中止。我没有在服务器上安装任何东西的权限,即使是perl模块,请建议另一种方法。我拒绝。找到一种安装模块的方法。复制粘贴模块源代码是最后的手段。我已经尝试了CPAN。请参阅以下输出:CPAN-I Tie::Array::CSV-bash:CPAN:找不到命令这是高安全性银行服务器,因此无法安装任何内容。看,您可以“安装”你的脚本。你确实在某个地方有写权限。将依赖模块复制到同一个地方。是的,我可以安装。请告诉我如何在没有CPAN的情况下安装,因为不允许CPAN,但允许手动安装。这是合理的,因为你没有注意问题所附评论中的要求。Quoted为了您的方便:>>是否需要与您正在读取的文件相同?>是的。是的,因为文件太大,无法存储在内存中。我的解决方案不会将文件存储在内存中。
#!/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";