Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 我想将哈希映射数据写入Excel_Perl_Perl Module_Perl Data Structures - Fatal编程技术网

Perl 我想将哈希映射数据写入Excel

Perl 我想将哈希映射数据写入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

下面是我在代码中使用print
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
    使用warnings
    。它对于定位更明显的bug是非常宝贵的

  • 不要使用
    @data=undef
    初始化数组。如果要清空现有数组,请写入
    @data=()
    。如果您要声明一个新数组,那么
    my@data
    将创建一个新的空数组

    同样的建议也适用于散列,这将是在
    %数据
    散列的开始处使用
    “”=>未定义
    的原因

  • 不要使用
    my$dt=`date+%m-%d-%Y%\I%\m`
    。您正在启动一个全新的shell流程,只是为了询问时间。你应该

    use Time::Piece;
    

    由此产生的结果不需要
    chomp
    ing

    但是您确定要
    %I
    ?这就给了你12小时的时间,所以这个值会在中午重置为零<代码>%H为您提供24小时的时间,而且更可能有用

  • 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 shell
sh
,您将程序作为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 );
        }
    }
}