在Perl中从数组创建CSV时出现问题

时间:2016-01-07 07:24:58

标签: arrays perl csv

我的问题简要说明:

我有一个需要转换为CSV的数组。我遇到了所需输出的问题,而不是转换它。

我的代码:

use strict;
use warnings;
use Text::CSV;
use Text::CSV_XS;
use Data::Dumper; 

my (@first_set, @final_set); 
my $file = do {
    open my $fh, '<', '<file_name>.txt' or die "Unable to open file for input: $!";
    local $/;
    <$fh>;
};

@first_set = ( $file =~ m/<regex>/g)  ;
while ( @first_set ) {
    @final_set = splice @first_set, 0, 26;
    open(my $output, '>', 'mpc7_file.csv') or die "Couldn't open file file.csv, $!";
    my $csv = Text::CSV -> new ( { sep_char => ",", eol => "\n", binary => 1, quote_char => undef } );
    foreach my $element ( @final_set ) { 
        $csv -> print ( \*$output, \@final_set );
    }   
    close($output) or die "Couldn't close file properly";
}

@final_set的内容:

10:38:49 788 56 51 56 61 56 59 56 51 56 80 56 83 56 50 45 42 45 50 45 50 45 43 45 54
10:38:51 788 56 51 56 61 56 59 56 51 56 80 56 83 56 50 45 42 45 50 45 50 45 43 45 54

CSV文件的内容:

10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54

期望输出:

我的CSV文件应包含@final_set(每个元素用逗号分隔)。

10:38:49,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54
10:38:51,788,56,51,56,61,56,59,56,51,56,80,56,83,56,50,45,42,45,50,45,50,45,43,45,54

问题:

我哪里错了?我真的不能理解我的错误。请帮忙。

编辑:

即使我将CSV文件创建块移到while循环之外,输出仍然是相同的。

1 个答案:

答案 0 :(得分:2)

好的,我知道你在做什么。问题是@final_set每次都会在while循环周围发生变化,无论你是在全局范围内还是在本地声明它,你应该每次都需要打印它的内容

也没有必要使用Text::CSV这样简单的数据。如您所见,每个变量在首次使用时都声明为 ,这是大多数语言中的最佳实践

use strict;
use warnings;

my $in_file  = '<file_name>.txt';
my $out_file = 'mpc7_file.csv';

my $data = do {
    open my $fh, '<', $in_file or die qq{Unable to open "$in_file" for input: $!};
    local $/;
    <$fh>;
};

my @first_set = $data =~ /<regex>/g;

open my $out_fh, '>', $out_file or die qq{Unable to open "$out_file" for output: $!};

while ( @first_set ) {
    my @final_set = splice @first_set, 0, 26;
    print $out_fh join(',', @final_set), "\n";
}

close $out_fh or die qq{Unable to close "$out_file": $!};