Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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
Arrays Perl:将数据从散列转储到excel_Arrays_Excel_Perl_Hash - Fatal编程技术网

Arrays Perl:将数据从散列转储到excel

Arrays Perl:将数据从散列转储到excel,arrays,excel,perl,hash,Arrays,Excel,Perl,Hash,我有一个包含键和值(数组)的散列。我想将它们转储到电子表格中,但在安排它们时遇到困难 %散列 按键1->foo-bar 按键2->约翰·亚当·吉尔 按键3->苹果香蕉芒果橙 代码: 使用严格; 使用警告; 使用Excel::Writer::XLSX; 我的$pattern=“开始”; 我的$格式; my@keys=qw(键1键2键3); foreach my$key(@keys){ 打开我的$fh,“编辑:现在你实际上已经更新了你的程序,以澄清问题在于你如何读取数据,下面的内容是没有意义的。但它

我有一个包含键和值(数组)的散列。我想将它们转储到电子表格中,但在安排它们时遇到困难

%散列
按键1->foo-bar
按键2->约翰·亚当·吉尔
按键3->苹果香蕉芒果橙

代码:

使用严格;
使用警告;
使用Excel::Writer::XLSX;
我的$pattern=“开始”;
我的$格式;
my@keys=qw(键1键2键3);
foreach my$key(@keys){

打开我的$fh,“编辑:现在你实际上已经更新了你的程序,以澄清问题在于你如何读取数据,下面的内容是没有意义的。但它确实说明了另一种方法

好的,这里的核心问题是你要做的是“翻转”一个散列。你要逐行打印,但是你的散列是按列组织的

使用逗号sep作为打印实际excel的快速代理:

#!/usr/bin/env perl
use strict;
use warnings;

use Data::Dumper;

#initialise
my %hash = (
    key1 => [qw (  foo bar  )],
    key2 => [qw (  john adam gill  )],
    key3 => [qw (  apple banana mango orange )],
);

#print for debug
print Dumper \%hash;


#get header row. Sort it, because hashes are unordered.
#could instead:
#my @keys = qw ( key1 key2 key3 );
my @keys = sort keys %hash;
#print header row
print join ",", @keys, "\n";

#iterate until every element of the hash is gone
while ( map { @{ $hash{$_} } } @keys ) {
    #cycle the keys, shifting a value of the top of each array. 
    #replace any undefined values with ''. 
    print shift( @{ $hash{$_} } ) // '', "," for @keys;
    print "\n";
}
这张照片是:

key1,key2,key3,
foo,john,apple,
bar,adam,banana,
,gill,mango,
,,orange,
如果您将其作为
csv
加载到Excel中,应该会得到您想要的结果。我很确定您可以在模块中使用类似的“写入行”

所以这实际上似乎是你想要的:

#!/usr/env/perl
use strict;
use warnings;

use Excel::Writer::XLSX;

#initialise
my %hash = (
    key1 => [qw (  foo bar  )],
    key2 => [qw (  john adam gill  )],
    key3 => [qw (  apple banana mango orange )],
);


my $workbook = Excel::Writer::XLSX->new('c:\TEMP\filename.xlsx');
if ( not defined $workbook ) {
    die "Failed to create spreadsheet: $!";
}
my $worksheet = $workbook->add_worksheet();

#  Add and define a format
my $format = $workbook->add_format();
$format->set_bg_color('yellow');

my @keys = sort keys %hash;
my $row  = 0;
$worksheet->write_row( $row++, 0, \@keys, $format );
while ( map { @{ $hash{$_} } } @keys ) {
    my $col = 0;
    $worksheet->write( $row, $col++, shift( @{ $hash{$_} } ) // '' )
        for @keys;
    $row++;
}
$workbook->close() or die "Error closing file: $!";

您没有正确清空匹配的
@行
数组。此行:

for (@matching_lines) { $_ = undef } 
将数组值设置为未定义,但不删除它们。
例如,如果
@matching_lines
('foo','bar')
,现在它变成
(undef,undef)
。当您稍后将
baz
qux
添加到它时,它变成
(undef,undef,'baz',qux')
。当您将这些
undef
添加到工作表时,它们变成空白单元格

要正确清空阵列,请使用:

@matching_lines = ();

您的示例中有一些输入错误。缺少了一个
my
,并且使用
%hash
%tools
没有意义。我修复了这些错误并运行了它,这给了我正确的输出,但是第1行和第a列是空的。它从B2开始,但看起来完全正确。我认为您做了一些其他事情作为您的真实代码。@simbabque感谢您指出错误。我已经更正了错误。我已经重新检查了我的代码并再次运行,但输出仍然与上面提到的当前输出相同。不确定,我遗漏了什么。您是否可以包含一个
print$行。“\n“;
在您的循环中验证
$row
是否没有递增?@Mr.Llama,它给了我输出
11
$row
没有递增,这就是标题(
键2
键3
的原因)正在正确打印。但是为什么只有值获得了空间。我尝试在excel外部打印哈希,结果显示值没有任何空格。您可以在脚本开头添加
使用Data::Dumper;
,并在foreach循环之前包括
打印转储程序($hash);
?是的。效果很好。谢谢。
@matching_lines = ();