使用Text :: CSV根据变量内容在csv文件上打印一行

时间:2015-12-13 16:15:17

标签: perl

我的脚本相当大,但我会在这里简化代码。 假设我创建了一个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文档中没有清楚地解释打印,没有直接的例子,我也不知道数组引用是什么。

3 个答案:

答案 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

选项调整CSV输出格式的详细信息

答案 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";