我必须阅读包含以下内容的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]);
}