perl +读取多个csv文件+操作文件+提供output_files

时间:2014-03-18 23:42:36

标签: perl csv

道歉,如果这有点长啰嗦,我真的很感激这里的答案,因为我很难让这个工作。

在此问题here的基础上,我有一个适用于csv文件(orig.csv)的脚本,并提供了我想要的csv文件(format.csv)。我想要的是使它更通用,并接受任何数量的' .csv'文件并提供'输出_ csv'对于每个输入的文件。有人可以帮忙吗?

 #!/usr/bin/perl

    use strict;
    use warnings;

    open my $orig_fh,   '<', 'orig.csv'   or die $!;
    open my $format_fh, '>', 'format.csv' or die $!;

    print $format_fh scalar <$orig_fh>; # Copy header line

    my %data;
    my @labels;

    while (<$orig_fh>) {
      chomp;
      my @fields = split /,/, $_, -1;
      my ($label, $max_val) = @fields[1,12];
      if ( exists $data{$label} ) {
        my $prev_max_val = $data{$label}[12] || 0;
        $data{$label} = \@fields if $max_val and $max_val > $prev_max_val;
      }
      else {
        $data{$label} = \@fields;
        push @labels, $label;
      }
    }

    for my $label (@labels) {
      print $format_fh join(',', @{ $data{$label} }), "\n";
    }

我希望使用here中的这个脚本,但是很难将2个放在一起:

#!/usr/bin/perl
    use strict;
    use warnings;
    #If you want to open a new output file for every input file
    #Do it in your loop, not here.
    #my $outfile = "KAC.pdb";
    #open( my $fh, '>>', $outfile );
    opendir( DIR, "/data/tmp" ) or die "$!";
    my @files = readdir(DIR);
    closedir DIR;
    foreach my $file (@files) {
    open( FH, "/data/tmp/$file" ) or die "$!";
    my $outfile = "output_$file"; #Add a prefix (anything, doesn't have to say 'output')
    open(my $fh, '>', $outfile);
    while (<FH>) {
    my ($line) = $_;
    chomp($line);
    if ( $line =~ m/KAC 50/ ) {
    print $fh $_;
    }
    }
    close($fh);
    }

脚本读取目录中的所有文件,并找到包含此字符串的行&#39; KAC 50&#39;然后将该行附加到output_$file的{​​{1}}。因此,对于每个inputfile,将会有1个output_$file

我已经注意到并且正在寻找修复的脚本问题:   - 它读取&#39;。&#39;和&#39; ..&#39;目录中的文件并生成一个    &#39;输出_&#39。和&#39;输出_ ..&#39;文件   - 它也会对此脚本文件执行相同的操作。

我还尝试通过添加此代码使该脚本在其运行的任何目录中工作,从而使其动态化:

inputfile

use Cwd qw();
my $path = Cwd::cwd();
print "$path\n";

**编辑::我已尝试合并版本但收到错误。非常感谢*

opendir( DIR, $path ) or die "$!";  # open the current directory 
open( FH, "$path/$file" ) or die "$!"; #open the file

组合代码::

UserName@wabcl13 ~/Perl
$ perl formatfile_QforStackOverflow.pl
Parentheses missing around "my" list at formatfile_QforStackOverflow.pl line 13.
source dir -> /home/UserName/Perl
Can't use string ("/home/UserName/Perl/format_or"...) as a symbol ref while "strict refs" in use at formatfile_QforStackOverflow.pl line 28.

1 个答案:

答案 0 :(得分:0)

您如何计划输入要处理的文件列表及其首选输出目的地?也许只有一个固定的目录,你想要处理所有的cvs文件,并在结果前添加前缀。

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

my $source_dir = '/some/dir/with/cvs/files';
my $output_prefix = 'format_';

opendir my $dh, $source_dir;
for my $file (readdir($dh)) {
    next if $file !~ /\.csv$/;
    next if $file =~ /^\Q$output_prefix\E/;

    my $orig_file = "$source_dir/$file";
    my $format_file = "$source_dir/$output_prefix$file";

    .... old processing code here ...

}

或者,您可以只使用输出目录而不是为文件添加前缀。无论哪种方式,这都应该让你顺利。