perl合并csv文件删除标题

时间:2014-08-21 13:25:34

标签: perl csv merge

我在文件夹中有几个csv格式的月度报告。 csv文件都有8个常用列(带标题)。使用perl,我想逐行合并这些文件。

文件1:

1,2,3,4,5,6,7,8,
a1,b1,c1,d1,e1,f1,g1,h1,
a1,b1,c1,d1,e1,f1,g1,h1,
a1,b1,c1,d1,e1,f1,g1,h1,

文件2:

1,2,3,4,5,6,7,8,
a2,b2,c2,d2,e2,f2,g2,h2,
a2,b2,c2,d2,e2,f2,g2,h2,
a2,b2,c2,d2,e2,f2,g2,h2,

我希望输出看起来像那样(加入行并删除标题)

输出:

1,2,3,4,5,6,7,8,
a1,b1,c1,d1,e1,f1,g1,h1,
a1,b1,c1,d1,e1,f1,g1,h1,
a1,b1,c1,d1,e1,f1,g1,h1,
a2,b2,c2,d2,e2,f2,g2,h2,
a2,b2,c2,d2,e2,f2,g2,h2,
a2,b2,c2,d2,e2,f2,g2,h2,

我已设法将文件名保存在数组中。但出于某种原因,我无法加入他们。 你可以帮我弄清楚我的代码有什么问题。我对perl很新。

#! C:Strawberry/perl/bin;
use feature ':5.12';
use strict;
use warnings;

my $data_directory = 'R:/testing_data/';

opendir( DIR, $data_directory ) or die "Could not open $data_directory $!\n";
my @files = grep {/_monthlyreport\.csv$/} readdir(DIR);    #to get on the monthly reports csv files

foreach my $file (@files) {
    open( HANR, "<", '$data_directory' . my $files ) or die "cannot open $files: $!";    #read handler
    open( HANW, ">>", "G:/outputfile_script.csv" ) or die "error $! \n"; #write handler for creating new sorted files
    my @lines = ();
    @lines = <HANR>;

    foreach my $line (@lines) {
        chomp($line);
        my $count++;
        next unless $count;    # skip header i.e the first line containing stock details
        print HANW join $line, "\n";
    }

    my $count = -1;
    close(HANW);
    close(HANR);
}

closedir(DIR);
exit 0;

3 个答案:

答案 0 :(得分:1)

您输入文件句柄的open语句格式错误,my $count++;也被破坏。

我还建议使用词法文件句柄来实现代码的现代化。以下是代码的清理版本:

use feature ':5.12';
use strict;
use warnings;
use autodie;

my $data_directory = 'R:/testing_data/';

opendir my $dh, "$data_directory";

open my $outfh, ">>", "G:/outputfile_script.csv";
my $seenheader = 0;

while (my $file = readdir $dh) {
    next unless $file =~ /_monthlyreport\.csv$/;

    open my $infh, '<', "$data_directory/$file";
    while (<$infh>) {
        print $outfh $_ if $. > 1 || ! $seenheader++;
    }
}

答案 1 :(得分:0)

如果计数器等于0,则添加计数器并停止打印;

#! C:Strawberry/perl/bin;
use feature ':5.12';
use strict;
use warnings;

my $data_directory = 'R:/testing_data/';

opendir(DIR,$data_directory) or die "Could not open $data_directory $!\n";
my @files = grep {/_monthlyreport\.csv$/} readdir(DIR); #to get on the monthly reports csv files

foreach my $file (@files) {

                    open(HANR ,"<",'$data_directory'.my $files) or die "cannot open $files: $!";                        #read handler 
                    open(HANW , ">>","G:/outputfile_script.csv") or die "error $! \n";          #write handler for creating new sorted files
                    my @lines=();
                    @lines=<HANR>;
         my $i =0;

        foreach my $line (@lines){

                next if ($i==0) ;
                                chomp ($line) ; 
                                my $count++;
                                next unless $count;                                              # skip header i.e the first line containing stock details
                                print HANW join $line,"\n";
                                }

        my $count= -1;
        close(HANW);
        close(HANR);
                   }

closedir(DIR);
exit 0;

答案 2 :(得分:0)

这条线错了。

open(HANR ,"<",'$data_directory'.my $files) or die "cannot open $files: $!";

应该是

open(HANR ,"<","$data_directory".$files) or die "cannot open $files: $!";