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 = ();