Csv 将逗号分隔的值逐行放入新文件

Csv 将逗号分隔的值逐行放入新文件,csv,Csv,在命令行中,我们传递多个由逗号分隔的值,例如作为选项的悉尼、德里、纽约、俄罗斯。这些值存储在perl脚本中的$runTest下。现在,我想在脚本下创建一个新文件,内容为$runTest,但要逐行创建。例如: 输入(从命令行传递的值): 输出(在新文件:myfile下): 在这个简单的示例中,在这种情况下,对分隔符使用split比使用tr更好。一些小要点:使用snake_case代替CamelCase作为名称,并使用autodie使打开,关闭等变得致命,而无需将代码与混在一起或死亡“…”: 一般

在命令行中,我们传递多个由逗号分隔的值,例如作为选项的悉尼、德里、纽约、俄罗斯。这些值存储在perl脚本中的
$runTest
下。现在,我想在脚本下创建一个新文件,内容为
$runTest
,但要逐行创建。例如:

输入(从命令行传递的值):

输出(在新文件:myfile下):


在这个简单的示例中,在这种情况下,对分隔符使用
split
比使用
tr
更好。一些小要点:使用snake_case代替CamelCase作为名称,并使用autodie使
打开
关闭
等变得致命,而无需将代码与
混在一起或死亡“…”


一般来说,除了这个简单的示例之外,对于更健壮的解析,更喜欢专门的模块,例如或用于csv解析。与过于简单的
拆分相比,
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};
}

在这个简单的示例中,在这种情况下,对分隔符使用
split
比使用
tr
更好。一些小要点:使用snake_case代替CamelCase作为名称,并使用autodie使
打开
关闭
等变得致命,而无需将代码与
混在一起或死亡“…”


一般来说,除了这个简单的示例之外,对于更健壮的解析,更喜欢专门的模块,例如或用于csv解析。与过于简单的
拆分相比,
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};
}

到目前为止,您尝试了什么代码?my$runTest='悉尼,德里,纽约,俄罗斯';打开我的$out,“>”、“我的文件”或死亡$!;打印{$out}$regsToRun=~tr/,/\n/r@Aakash:请在您的问题中输入代码,而不是评论。到目前为止您尝试了哪些代码?我的$runTest='悉尼,德里,纽约,俄罗斯';打开我的$out,“>”、“我的文件”或死亡$!;打印{$out}$regsToRun=~tr/,/\n/r@阿卡什:请在你的问题中加入代码,而不是评论。最终
split
会咬到你的。对于CSV,升级类似于
Text::csvxs
的内容。比OP更多的人阅读答案并遵循建议。感谢@briandfoy的建议,将此添加到答案中。最终,
split
会咬到你。对于CSV,升级类似于
Text::csvxs
的内容。比OP更多的人阅读答案并遵循建议。感谢@briandfoy的建议,将此添加到答案中。
use autodie;
my $run_test = 'sydney,delhi,NY,Russia'; 
open my $out, '>', 'myFile'; 
print {$out} map { "$_\n" } split /,/, $run_test; 
close $out;
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};
}