Perl:将一个文件的内容与其他几个文件的内容进行比较

时间:2016-01-17 05:46:38

标签: regex perl file-io

我必须阅读包含以下内容的CSV文件(TEST.csv):

Sl.No, Label, Customer1, Customer2, Customer3...
1, label1, Y, N, Y...
2, label2, N, Y, Y...
...

并仅检索标记为" Y"的标签。为每个"客户",进入该客户"的外部文件。在SO成员的另一个问题的帮助下,我设法停止迷失在嵌套数据结构的迷宫中,并使用下面的结构。在这里,我复制标记为" Y"的标签。到相应客户的临时文件_temp.h

现在,实际的"外部文件"我需要写的不仅仅是标签,而是一个"内部文件的副本" internal.h,其中包含以下格式的数据:

/*...comments*/
#define header_label1    val1;
#define header_label2    val2;
...

例如,我可能有一行#define ABC_Comp1_X_H_CompDes1 value。如果我为客户1创建的临时文件中存在标签Comp1_CompDes1,则上面的行将被复制到客户1的最终外部文件中。

以下代码是我正在使用的代码。但是,这会引发错误"全局符号"%tempLines"需要明确的包名称"对于标记为" HERE"的行,虽然我没有使用散列,但在下一行w.r.t中也有语法错误。花括号。

对于这些错误背后原因的任何指导都将受到高度赞赏。

use strict;
use warnings;
use File::Slurp;
use Data::Dumper;

my $numCustomers;

my $intHeaderFile = "internal.h";

open(my $fh, "<", "TEST.csv") or die "Unable to open CSV, $!";
open(my $infh, "<", $intHeaderFile) or die "Cannot open $intHeaderFile, $!";
my @headerLines = read_file($intHeaderFile);

chomp( my $header = <$fh> );
my @names = split ",", $header; 
$numCustomers = scalar(@names) - 2;
print "\nNumber of customers : $numCustomers\n";
my @customerNames;
for(my $i = 0; $i < $numCustomers; $i++)
{
   push @customerNames, $names[$i + 2]; 
}

my @tempHandles;
my @handles;
my @tempfiles;
my @files;
for(my $i = 0; $i < $numCustomers; $i++)
{
    my $custFile = "customer".$i."_external.h";
    open my $fh, '>', $custFile or die "$custFile: $!";
    push @handles, $fh;
    push @files, $custFile;

    my $tempFile = "customer".$i."_temp.h";
    open my $fh1, '+>', $tempFile or die "$tempFile: $!";
    push @tempHandles, $fh1;
    push @tempfiles, $tempFile;
}


while (<$fh>) 
{
    chomp;
    my $nonIncLine = $_;
    my @fields = split ",", $nonIncLine;
    next if $. == 1;
    for(my $i = 0; $i < $numCustomers; $i++) 
    {
       print { $tempHandles[$i] } $fields[1], "\n" if 'Y' eq $fields[ $i + 2 ]; 
    }
}


for(my $i = 0; $i < $numCustomers; $i++) 
{
    my @tempLines = read_file($tempfiles[$i]);
    print @tempLines;
    foreach my $headerLine(@headerLines)
    {
        if (grep { $headerLine =~ /$_/} @tempLines )         #HERE
        {
            print { $handles[$i] } $headerLine, "\n"; 
        }
    }
    unlink($tempfiles[$i]);
}

0 个答案:

没有答案