首页 > 解决方案 > 将逗号分隔的值逐行放入新文件中

问题描述

从命令行,我们传递多个用逗号分隔的值,例如sydney,delhi,NY,Russia选项。这些值存储$runTest在 perl 脚本中。现在我想在脚本下创建一个新文件,内容为$runTest但逐行。例如:

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

sydney,delhi,NY,Russia

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

sydney
delhi
NY
Russia

标签: csv

解决方案


在这个简单的示例中,最好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::CSVText::CSV_XS用于 csv 解析。与过于简单的 相比splitText::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};
}

推荐阅读