如何通过perl搜索和替换CSV中的列?

时间:2015-09-15 19:06:07

标签: perl csv replace

所以,我是perl的新手...我在公司网络中的一个Windows框中。我无法下载CPAN模块...

我有一个用多列导出的CSV,第二列包含2行文本,其余行是IP地址。我需要更改显示除文本之外的所有行的IP的前3个八位字节。然后我需要将它保存到同一个文件,或者创建一个新的...我还需要所有其他列保留在文档中。我看了看,每个人都建议有意义的模块,但我无法得到它们。这是我的代码:

.DisplayAds_Grid { width: 100%; float: none; display: inline-block; margin-top: 20px; vertical-align: top;}
.DisplayAds_Grid .Banner_Wrapper { width: 18%; min-height: 178px; float: none; display: inline-block; vertical-align: top; background-color: #fff; margin-bottom: 5px; margin-right: 5px; text-align: center; border: 3px solid #dfdfdf; padding: 10px; }

所以我最终只得到一个包含此代码的更新IP的列。我如何在世界上获得其余的CSV ...是否有更简单的方法来替换IP的????看起来这很容易,但CSV很难。任何帮助,将不胜感激。附:我正在使用严格和警告:)

所以只是为了澄清我知道@fields被排除在外并因此没有被打印......我要问的是我如何仅更新第二列中的数据然后将整个文档放回一个新文件?

2 个答案:

答案 0 :(得分:0)

您需要输出的不仅仅是更改的字段......

my @fields = split(/,/, $line);
$fields[1] =~ s/$oldsubnet/$newsubnet/g;
print $ofh join(',', @fields);

另外,不要在循环中打开输出文件来读取输入文件。

答案 1 :(得分:0)

如果没有您的源CSV,我无法肯定地说,但会思考"使用Text::CSV模块":

#!/usr/bin/env perl;
use strict;
use warnings;
use Text::CSV;

print "Old subnet ex: 10.0.0\n";
my $oldsubnet = <STDIN>;
chomp $oldsubnet;
print "New subnet ex: 10.0.0\n";
my $newsubnet = <STDIN>;
chomp $newsubnet;

my $file  = "path\\file.csv";
my $ofile = "path\\test.csv";

open( my $input,  '<', $file )  or die "'$file' would not open $!";
open( my $output, '>', $ofile ) or die "'$ofile' would not open $!";
my $csv = Text::CSV->new( { binary => 1, eol => "\n" } );

while ( my $row = $csv->getline() ) {
    $row->[1] =~ s/$oldsubnet/$newsubnet/;
    $csv->print( $output, $row );
}

并不总是最好的答案,但是在您尝试阅读CSV,更改单个字段以及编写CSV的情况下,它的效果非常好。