2015-12-27 38 views
0

嗨我有一個tsv文件,我試圖打印標題行和文件的每一行,即在列中。我很困惑如何在打印語句中加入這些行。打印標題行和文件中的每一行文件,並列在列

#!/usr/bin/perl 
use strict; 
use warnings; 
local $" = "'\n'";  
my @temp; 

while (<DATA>) { 
    chomp; 
    my @columns = join "\t", $_; 
    push @temp, @columns; 
} 

my $Header_row = shift (@temp); 
my @head; 
my $abc; 
my @abc = split(/\t/,$Header_row); 
     for my $abc(@abc) { 
     push @head, $abc ."\n"; 


} 
my @roows; 
my $elements; 
     foreach (@temp){ 
     chomp; 
my $line = $_; 
my @elements = split ("\t", $line); 
     for $elements(@elements){ 
     push @roows, $elements ."\n"; 

} 
} 
     #print @head, $abc ."\n"; 
     #print @roows, $elements ."\n"; 



__DATA__ 
Year Tonn Class Cargo Type 
88 61 T Rice Truck 
89 55 G Corn Train 
92 93 S Peas Ship 

所需的輸出

輸出

Year 88 
Tonn 61 
Class T 
Cargo Rice  
Type Truck 

Year 89 
Tonn 55 
Class G 
Cargo Corn  
Type Train 

Year 92 
Tonn 93 
Class S 
Cargo Peas  
Type Ship 
+2

這是不是很清楚你想要做什麼。看起來你只是想讀取內容並重新打印出來,而我不明白你爲什麼要修改它們。預期產出的一個例子會有所幫助 – Borodin

回答

1

真的沒有必要通過循環打印出來之前閱讀所有的線爲@temp。這將是更有效的閱讀僅僅是第一線打通剩餘的行標題,然後循環立即將它們打印:

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

my @temp; 

my $line = <DATA>; 
chomp($line); 
my @head = split "\t", $line; 

foreach $line (<DATA>) { 
    chomp($line); 
    my @elements = split ("\t", $line); 
    foreach my $i (0..$#head) { 
     print $head[$i], "\t", $elements[$i], "\n"; 
    } 
    print "\n"; 
} 

__DATA__ 
Year Tonn Class Cargo Type 
88 61 T Rice Truck 
89 55 G Corn Train 
92 93 S Peas Ship 

print一行也可以寫爲:

print "$head[$i]\t$elements[$i]\n"; 

我只是認爲把所有部分分開是更清楚一點的。

2

根據視頻源,這應該做的伎倆:

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

#read the header line into @header;  
my $header_line = <DATA>; 
chomp $header_line; 
chomp (my @header = split (' ', $header_line); 

#iteraate data fh  
while (<DATA>) { 
    #strip linefeed 
    chomp; 
    #read this row into a hash 
    my %row; @row{@header} = split; 
    #print this hash in the same order as the header. 
    #note - $_ is set to each element of header in turn when doing this. 
    print "$_\t$row{$_}\n" for @header; 
    #insert extra linefeed 
    print "\n"; 
} 

__DATA__ 
Year Tonn Class Cargo Type 
88 61 T Rice Truck 
89 55 G Corn Train 
92 93 S Peas Ship 

注 - 您可以進一步認爲「讀頭」凝結:

chomp (my @header = split (' ', <DATA>)); 

哪個做同樣的事情,但可能有點難以遵循。

相關問題