Perl 我想将哈希映射数据写入Excel
下面是我在代码中使用printPerl 我想将哈希映射数据写入Excel,perl,perl-module,perl-data-structures,Perl,Perl Module,Perl Data Structures,下面是我在代码中使用printDumper(\%Data)时得到的输出 { "" => undef, "123456789012:SRIRAMA" => [123456789012, "SRIRAMA", 856.06, 0, 0, 0], "389252737122:RAMA" => [389252737122, "RAMA", 345.76, 0, 0, 0], } 我必须将这些数据写入Excel文件,如下所示 Number Name
Dumper(\%Data)
时得到的输出
{
"" => undef,
"123456789012:SRIRAMA" => [123456789012, "SRIRAMA", 856.06, 0, 0, 0],
"389252737122:RAMA" => [389252737122, "RAMA", 345.76, 0, 0, 0],
}
我必须将这些数据写入Excel文件,如下所示
Number Name number name amt amt2 amt3 amt4
123456789012 SRIRAMA 123456789012 SRIRAMA 856.06 0 0 0
389252737122 RAMA 389252737122 RAMA 345.76 0 0 0
前两列是一个SQL结果,其余列是另一个SQL查询结果
我将第一个查询结果放在地图中,并根据第二个查询结果中的键进行搜索,最后得到上面的输出
这里,Number
和Name
——前两列是搜索数据的键
下面的代码是在获取SQL结果后生成的:
foreach ( @Sqlresult ) {
$rec_cntr = $rec_cntr + 1;
my @fields = undef;
chop;
next if /^$/;
next if /ERROR:/;
next if /ORA-/;
@fields = split( /::/, $_ );
my $fldref = @fields;
$ent_id = undef;
$ent_id = $fields[0];
$key = undef;
$key = $fields[0] . ":" . $name;
push( @{ $Data{$key} }, $fields[1] );
}
$rec_cntr = 0;
下面的代码片段是我在记录不存在时使用的
my $kkey = undef;
for $kkey ( sort keys %Data ) {
next if $kkey eq '';
my $Lent = @{ $Data{$kkey} };
if ( $Lent < 5 ) {
push( @{ $Data{$kkey} }, 0 );
}
print scalar @{ $Data{$kkey} };
}
print Dumper( \%Data );
那里有很多书要读,但这些想法可能会有所帮助
- 在您编写的每个Perl程序的顶部,始终
和使用strict
。它对于定位更明显的bug是非常宝贵的使用warnings
- 不要使用
初始化数组。如果要清空现有数组,请写入@data=undef
。如果您要声明一个新数组,那么@data=()
将创建一个新的空数组 同样的建议也适用于散列,这将是在my@data
散列的开始处使用%数据
的原因“”=>未定义
- 不要使用
。您正在启动一个全新的shell流程,只是为了询问时间。你应该my$dt=`date+%m-%d-%Y%\I%\m`
及 由此产生的结果不需要use Time::Piece;
ing 但是您确定要chomp
?这就给了你12小时的时间,所以这个值会在中午重置为零<代码>%H为您提供24小时的时间,而且更可能有用%I
比chomp
更可取,除非你正在做一些不寻常的事情chop
将只删除字符串中的最后一个字符,不管它是什么,而chop
将删除最后一个字符(如果它是换行符)chomp
将循环哈希设置for(%Data){…}
$\ucode>到key1、val1、key2、val2等。这不是您想要的 在这种情况下,由于键中的信息在值中重复,您可能需要
。但该值是数组引用,因此不需要拆分for(values%Data){…}
my $rownum = 0;
for my $values ( values %Data ) {
my $colnum = 0;
for my $val ( @$values ) {
if ( isfloat($_) ) {
$current_ws->write_number( $rownum, $colnum++, $val );
}
else {
$current_ws->write_string( $rownum, $colnum++, $val );
}
}
}
您需要先显示您的程序,然后我们才能帮助您修复。您好Borodin,谢谢回复。对于我来说,得到结果并将其推入一个正确工作的地图,但不确定如何将其写入excel表格。谢谢。你可以回答自己的问题,但你写的不是答案。你应该编辑你的问题,在那里添加信息。在您的问题下方有一个
编辑链接。我已经为您添加了它,所以请删除您的答案。非常感谢您的解释,一些我如何使它工作的我需要的,将在我完成后粘贴代码。我总是在运行perl程序时收到一个错误sh:line 15:warning:here文档在第0行,由文件结尾分隔(想要的“!”)但是在第15行中,我有代码:sub-isfloat{my$val=shift;return$val=~m/^\d+。\d+$/;}@Rama:您使用sh而不是perl运行程序。这是你写的代码吗?当您获得转储程序
输出时,您是如何运行它的?我不理解您所问的术语,我像./program一样运行脚本。pl@Rama:听起来您使用的是Bourne shellsh
,您将程序作为shell脚本传递给该shell以执行,而该脚本不理解Perl。我猜你没有shebang#程序开始时的代码>行。您可以使用perl program.pl
my $dt = localtime->strftime('%m-%d-%Y_%I%M');
my $rownum = 0;
for my $values ( values %Data ) {
my $colnum = 0;
for my $val ( @$values ) {
if ( isfloat($_) ) {
$current_ws->write_number( $rownum, $colnum++, $val );
}
else {
$current_ws->write_string( $rownum, $colnum++, $val );
}
}
}