使用CSV_XS读入.CSV文件并选择特定列

时间:2015-04-02 15:57:34

标签: perl csv export

我想使用CSV_XS读取.csv文件,然后从with标题中选择列以匹配输出新.csv的数组中存储的内容

use strict;
use warnings;




use Text::CSV_XS;

my $csvparser = Text::CSV_XS->new () or die "".Text::CSV_XS->error_diag();
my $file;
my @headers;

foreach $file (@args){
        my @CSVFILE;
        my $csvparser = Text::CSV_XS->new () or die "".Text::CSV_XS->error_diag();


        for my $line (@csvfileIN) {
                $csvparser->parse($line);
                my @fields = $csvparser->fields;

                $line = $csvparser->combine(@fields);
        }

}

2 个答案:

答案 0 :(得分:1)

use open ":std", ":encoding(UTF-8)";

use Text::CSV_XS qw( );

# Name of columns to copy to new file.
my @col_names_out = qw( ... );

my $csv = Text::CSV_XS->new({ auto_diag => 2, binary => 1 });

for (...) {
   my $qfn_in  = ...;
   my $qfn_out = ...;

   open(my $fh_in, "<", $qfn_in)
      or die("Can't open \"$qfn_in\": $!\n");
   open(my $fh_out, "<", $qfn_out)
      or die("Can't create \"$qfn_out\": $!\n");

   $csv->column_names(@{ $csv->getline($fh_in) });
   $csv->say($fh_out, \@col_names_out);

   while (my $row = $csv->getline_hr($fh_in)) {
      $csv->say($fh_out, [ @$row{@col_names_out} ]);
   }
}

答案 1 :(得分:1)

下面的示例仅将CSV文件解析为一个变量,然后您可以匹配,删除该变量,在其中添加行,然后将该变量写回到同一CSV文件中。

在此示例中,我仅从CSV中删除了一个输入行。 首先,我只解析CSV文件。

use Text::CSV_XS qw( csv );
$parsed_file_array_of_hashesv = csv(
    in      => "$input_csv_filename",
    sep     => ';',
    headers => "auto"
);    # as array of hash

第二,一旦有了 $ parsed_file_array_of_hashesv ,现在您可以在perl中循环该数组并检测要从该数组中删除的行。 然后使用

将其删除

拼接阵列,偏移量,长度

从索引OFFSET到索引OFFSET + LENGT删除所有内容

让我们假设索引为0

my @extracted_array = @$parsed_file_array_of_hashesv;    #dereference hashes reference
splice @extracted_array, 0, 1;#remove entry 0
$ref_removed_line_parsed = \@extracted_array;            #referece to array

第三,将数组写回到CSV文件

$current_metric_file    = csv(
    in      => $ref_removed_line_parsed,                 #only accepts referece
    out     => "$output_csv_filename",
    sep     => ';',
    eol     => "\n",                                   # \r, \n, or \r\n or undef
    #headers => \@sorted_column_names,              #only accepts referece
    headers => "auto"
); 

请注意,如果您使用\ @sorted_column_names,则可以控制列的顺序

my @sorted_column_names;
foreach my $name (sort {lc $a cmp lc $b} keys %{ $parsed_file_array_of_hashesv->[0] }) { #all hashes have the same column names so we choose the first one
    push(@sorted_column_names,$name);
}

那应该在没有一行的情况下写CSV文件。