2016-04-13 55 views
4

Anahtar ve Değerler (dizi) ile bir hash'ım var. Onları bir e-tabloya bırakmak, ancak bunları düzenlemekte zorlanmak istiyorum.Perl: Verileri bir hashtan excel'e dökme

% karma
key1 -> foo bar
key2-> john adam solungaç
key3-> elma muz, mango turuncu

Kodu:

use strict; 
use warnings; 
use Excel::Writer::XLSX; 

my $pattern = "BEGIN_"; 
my $format; 
my @keys = qw(key1 key2 key3); 
foreach my $key(@keys){ 
    open my $fh, "<","filename.txt" or die $!; 
     while (<$fh>) { 
     if (/$pattern/) { 
     push(@matching_lines, $_); 
     } 
    } 
    $hash{$key} = [@matching_lines] ; 
    for (@matching_lines) { $_ = undef } ; #Emptying the array contents,to reuse it for for all the other keys 
} 

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 
$format = $workbook->add_format(); 
$format->set_bg_color('yellow'); 

my $row = 1; 
my $col = 0; 

foreach my $k (keys %hash) 
{ 
    $worksheet->write($row, $col, $k, $format); # title 
    $worksheet->write_col($row+1, $col, $hash{$k}); #value 
    $col++; 
} 
$workbook->close() or die "Error closing file: $!"; 

Akım Çıkış

enter image description here
İstenilen Çıktı

enter image description here

+0

sizin örnekte bazı yazım hataları vardır. Benim bir "eksik "im var ve'% hash' ve '% tools' kullanımı mantıklı değil. Onları tamir ettim ve çalıştırdım, bu da bana doğru çıktıyı verdi, ama 1. satır ve A sütunu boş. B2'de başlar, ancak tamamen doğru görünüyor. Bence senin [mcve] senin gerçek kodun başka bir şey yaptı. – simbabque

+0

@simbabque Yazım hatalarını işaretlediğiniz için teşekkür ederiz.Onları düzelttim. Kodumu iki kez kontrol ettim ve tekrar koştum ve hala çıkış yukarıda bahsedilen akım çıkışı ile aynı. Emin değilim, ne eksik – Jill448

+1

Bir print $ satır içerebilir. "\ n"; '$ satırının artırıldığını doğrulamak için döngünüzün içinde mi? –

cevap

2

. Bu hat:

for (@matching_lines) { $_ = undef } 

undef için dizi değerlerini ayarlar, ancak onlara kaldırmaz. Örneğin, @matching_lines, ('foo', 'bar') ise, (undef, undef) olur. Daha sonra baz ve qux eklediğinizde, (undef, undef, 'baz', 'qux') olur. Bu undef s, çalışma sayfasına eklediğinizde boş hücreler olur.

doğru diziyi boşaltmak için kullanın:

@matching_lines =(); 
+0

Yep. Mükemmel çalıştı. Teşekkür ederim. – Jill448

3

Düzenleme: Şimdi aslında sorun verilerinizi okuyorsun nasıl olduğunu netleştirmek için Programınızı güncelledik, aşağıda tartışmaya açıktır. Fakat alternatif bir yaklaşımı göstermektedir.

Tamam, asıl sorun burada yapmaya çalıştığınız şey 'çevirme' bir karma. Satırda satır yazdırıyorsunuz, ancak karma formunuz sütunlarda düzenleniyor.

gerçek excel baskı için hızlı bir proxy olarak virgül sep kullanma:

#!/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"; 
} 

Bu baskılar:

key1,key2,key3, 
foo,john,apple, 
bar,adam,banana, 
,gill,mango, 
,,orange, 

Excel içine csv olarak yüklemek bile, istenilen sonucu vermelidir. Ben modül ile benzer bir 'yazma satırı' kullanabilirsiniz eminim.

Yani bu aslında ne istediğinizi yapmak görünüyor: Sen doğru @matching_lines dizi boşaltma değiliz

#!/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: $!"; 

Output