csv - 将逗号分隔的值逐行放入新文件中
问题描述
从命令行,我们传递多个用逗号分隔的值,例如sydney,delhi,NY,Russia
选项。这些值存储$runTest
在 perl 脚本中。现在我想在脚本下创建一个新文件,内容为$runTest
但逐行。例如:
输入(从命令行传递的值):
sydney,delhi,NY,Russia
输出(在新文件下:myfile):
sydney
delhi
NY
Russia
解决方案
在这个简单的示例中,最好split
在分隔符上使用而不是tr
在这种情况下使用。一些小问题:使用snake_case代替CamelCase作为名称,use autodie
并使open
,close
等成为致命的,而无需使用以下代码来混淆代码or die "..."
:
use autodie;
my $run_test = 'sydney,delhi,NY,Russia';
open my $out, '>', 'myFile';
print {$out} map { "$_\n" } split /,/, $run_test;
close $out;
一般来说,为了更健壮的解析,除了这个简单的例子,更喜欢专门的模块,例如Text::CSV或Text::CSV_XS用于 csv 解析。与过于简单的 相比split
,Text::CSV_XS
可以正确输入/输出带引号的字段、包含分隔符(逗号)的字段、二进制字符、提供错误消息等。例子:
use Text::CSV_XS;
use autodie;
open my $out, q{>}, q{myFile};
# All of these input strings are parsed correctly, unlike when using "split":
# my $run_test = q{sydney,delhi,NY,Russia};
# my $run_test = q{sydney,delhi,NY,Russia,"field,with,commas"};
my $run_test = q{sydney,delhi,NY,Russia,"field,with,commas","field,with,missing,quote};
# binary => 1 : enable parsing binary characters in quoted fields.
# auto_diag => 1 : print the internal error code and the associated error message to STDERR.
my $csv = Text::CSV_XS->new( { binary => 1, auto_diag => 1 } );
if ( $csv->parse( $run_test ) ) {
print {$out} map { "$_\n" } $csv->fields;
}
else {
print STDERR q{parse() failed on: }, $csv->error_input, qq{\n};
}