我的脚本相当大,但我会在这里简化代码。 假设我创建了一个CSV,并按照以下方式编写标题:
my $csv = Text::CSV->new ({binary => 1}, eol => "\n");
open(my $out, ">", "$dir/out.csv") or die $!; #create
$out->print("CodeA,CodeB,Name,Count,Pos,Orientation\n"); #I write the header
假设我将一些值存储在不同的变量中,并且我想将这些变量写为CSV中的一行。 我无法弄清楚如何,因为在Text :: CSV文档中没有清楚地解释打印,没有直接的例子,我也不知道数组引用是什么。
答案 0 :(得分:10)
以下是使用Text::CSV编写CSV文件的简单示例。它生成标题行和数据行,并从固定数据生成。
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new({binary => 1, eol => $/ })
or die "Failed to create a CSV handle: $!";
my $filename = "output.csv";
open my $fh, ">:encoding(utf8)", $filename or die "failed to create $filename: $!";
my(@heading) = ("CodeA", "CodeB", "Name", "Count", "Pos", "Orientation");
$csv->print($fh, \@heading); # Array ref!
my(@datarow) = ("A", "B", "Abelone", 3, "(6,9)", "NW");
$csv->print($fh, \@datarow); # Array ref!
close $fh or die "failed to close $filename: $!";
数据行收集在一个数组中 - 我使用了@heading
和@datarow
。如果我输出多行,则可以在@datarow
中收集或创建每一行,然后输出。 $csv->print
的第一个参数应该是I / O句柄 - 这里是$fh
,输出文件的文件句柄。第二个应该是数组引用。使用\@arrayname
是创建数组引用的一种方法; Text :: CSV模块的输入例程也创建并返回数组引用。
请注意此处Text::CSV->new
调用中使用的符号与示例中使用的符号之间的区别。另请注意,您的$out->print("…");
调用使用的是基本文件I / O,与Text :: CSV无关。与$csv->print($fh, …)
对比。
其余代码或多或少是样板文件。
output.csv
CodeA,CodeB,Name,Count,Pos,Orientation
A,B,Abelone,3,"(6,9)",NW
请注意,带有嵌入式逗号的值被Text :: CSV模块的引号括起来。其他值不需要引号,所以他们没有得到它们。您可以使用Text::CSV->new
。
答案 1 :(得分:2)
对于标题,您可以使用
a,IP,b,c,d,e,f,g
info,192.168.0.1,info1,info2,info3,info4,info5,info6
并且对于一行值使用
$status = $csv->print ($out,[qw(CodeA CodeB Name Count Pos Orientation)]);
答案 2 :(得分:-2)
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $file = $ARGV[0] or die "Need to get CSV file on the command line\n";
my $csv = Text::CSV->new ({
binary => 1,
auto_diag => 1,
sep_char => ',' # not really needed as this is the default
});
my $sum = 0;
open(my $data, '<:encoding(utf8)', $file) or die "Could not open '$file' $!\n";
while (my $fields = $csv->getline( $data )) {
$sum += $fields->[2];
}
if (not $csv->eof) {
$csv->error_diag();
}
close $data;
print "$sum\n";