Perl text :: csv检查然后添加字段

时间:2014-02-18 00:56:45

标签: perl csv text

我正在读取csv文件并检查某个字段中的文本。 如果文本存在,我想保留该行,并添加一个字段。

程序中的以下while循环正常工作,以保存col [17]中带有文本的行:

while (my $row = $csv->getline($infh)) {
    if ($row->[16] ne ""){
    my $string = $csv->string;
    print {$outfh} $string;
    }
}

在另一个测试程序中,以下while循环也可正常工作,添加一个字段:

while (my $row = $csv->getline($infh)) {
    splice @$row, 1, 0, "1GM";
    $csv->print($outfh, $row);
}

我想将这些结合起来在同一个程序中工作,但我有语法nitemares。 任何人都可以向perl新手展示一些指示吗?

这是完整的“测试程序”:

#!/usr/bin/perl

use strict;
use warnings;
use Text::CSV;
use Cwd;
use File::Basename;

my $dirname = basename(getcwd);
my $input_file = $dirname . ".txt";
my $output_file = $dirname . '_extract.txt';
my $csv = Text::CSV->new({binary => 1, eol=> "\015\012"})
    or die "Cannot use CSV: ".Text::CSV->error_diag ();

open my $infh, $input_file or die "Cannot open '$input_file': $!";   
open my $outfh, '>>', $output_file or die "Cannot open '$output_file': $!";

while (my $row = $csv->getline($infh)) {
    splice @$row, 1, 0, "1GM";
    $csv->print($outfh, $row);
}

close $infh;
close $outfh;
$csv->eof or die "Processing of '$input_file' terminated prematurely";

添加了: 我希望测试程序还包括文本的测试,以某种方式使用;

if ($row->[16] ne "")

从另一个程序 - 这样额外的列只会添加到我想要保留的行中。 无法弄清楚如何做到这一点......

已添加2/18:此工作!,但似乎不太优雅......

#!/usr/bin/perl

use strict;
use warnings;
use Text::CSV;
use Cwd;
use File::Basename;

my $dirname = basename(getcwd);
my $input_file = $dirname . ".txt";
my $output_file = $dirname . '_extract.txt';
my $column = '1GM'; # Text for new column to insert if a match
my $csv = Text::CSV->new({binary => 1, eol=> "\015\012"})
    or die "Cannot use CSV: ".Text::CSV->error_diag ();

open my $infh, $input_file or die "Cannot open '$input_file': $!";   
open my $outfh, '>>', $output_file or die "Cannot open '$output_file': $!";

while (my $row = $csv->getline($infh)) {

    if ($row->[16] ne "") # add/insert column if col[17] has text
    {
    splice @$row, 1, 0, "$column";

    if ($row->[1] eq "$column") # print to file only rows with new column
        { 
        $csv->print($outfh, $row);
        }
    }

}

close $infh;
close $outfh;
$csv->eof or die "Processing of '$input_file' terminated prematurely";

已添加2/18 5:40 pm - 知道了......这有效!!

while (my $row = $csv->getline($infh)) {

    splice @$row, 1, 0, "$column"; # add column

    if ($row->[17] ne "")  # print if test is true
    {
        $csv->print($outfh, $row);
    }

}

0 个答案:

没有答案