我想使用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);
}
}
答案 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文件。