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

Blu*_*rry 3 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
Run Code Online (Sandbox Code Playgroud)

假设我得到了一些存储在不同变量中的值,我想将这些变量写成CSV中的一行.我无法弄清楚如何,因为在Text :: CSV文档中没有清楚地解释打印,没有直接的例子,我不知道数组引用是什么.

Jon*_*ler 12

这是使用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: $!";
Run Code Online (Sandbox Code Playgroud)

数据行收集在一个数组中 - 我使用@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
Run Code Online (Sandbox Code Playgroud)

请注意,带有逗号的值包含在Text :: CSV模块的引号中.其他值不需要引号,所以他们没有得到它们.您可以使用选项调整CSV输出格式的详细信息Text::CSV->new.