2017-08-20 46 views
2

我有一個文本文件,製表符分隔,如下所示:Perl中,閱讀文本文件,保存列使用列的元素要打開其他文件

<這是一個標題

COL1 COL2 COL3
blablabla text1.txt blablabla
blablabla text2.txt blablabla
blablabla text3.txt blablabla

我希望能夠提取某些元素(列),在這種情況下,只能使用單詞text1.txt,text2.txt和text3.txt。我想稍後使用它們來打開這些名稱的文件。 到目前爲止,我有代碼:

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

my @fields; 
my ($column1, $column2, $column3); 

my $text = "text.txt"; 

open(FILE, $text) or die "Could not read from $text, program halting."; 

my @files; 

while(<FILE>) 
{ 
    chomp; 
    /^</ and next; 
    /^\s*$/ and next; 
    /line*/ and next; 

    ($column1, $column2, $column3) = split('\s', $_); 

#PRINT ONE 
#print $column2, "\t"; 


} 
#PRINT TWO 
print $column2, "\t"; 

close FILE; 

如果我做了打印與#PRINT ONE評論,我得到了正確的版本,僅作爲輸出,與所有三個要素,但是當我嘗試將其保存在另一個變量或將其寫入文件,只保留「text3.txt」。 如果我在#PRINT TWO中執行打印,我只會得到一個元素,同樣的text3.txt。 我該如何學習?我已經嘗試了很多來自這個網站的代碼,但目前沒有結果。謝謝。

+0

每次通過循環時,您都會爲列獲得新的數字,爲該行重寫前一行的數字(在'$ columnN'變量中)。保存它們:'push @ col2,$ column2;'(而不是註釋掉print);在循環之前聲明數組。循環後打印的值僅適用於最後一個數字。 – zdim

+0

非常感謝。有效。 – Megiddo

回答

2

發生這種情況是因爲您在循環的每次通過時都覆蓋了$column2,因此在離開循環後,您將得到最後一個結果(text3.txt)。

您可以寫入循環中的文件,本例顯示。這也說明了如何使用適當的3-ARG open,與詞法文件句柄:

use warnings; 
use strict; 

my $input_file = 'data.txt'; 
my $output_file = 'out.txt'; 

open my $fh, '<', $input_file or die $!; 
open my $wfh, '>', $output_file or die $!; 

while (<$fh>){ 
    chomp; 
    next if /^\</; 
    next if /^\s*$/; 

    my ($c1, $c2, $c3) = split /\s/, $_; 

    print $wfh "$c2\n"; 
} 

鑑於這種作爲輸入文件:

< this is a header 

col1 col2 col3 
blablabla text1.txt blablabla 
blablabla text2.txt blablabla 
blablabla text3.txt blablabla 

產地:

col2 
text1.txt 
text2.txt 
text3.txt 

..在輸出文件中。你必須理清如何過濾第一行。

您也可以將輸出保存在循環中的數組,然後在其上後工作:

use warnings; 
use strict; 

my $input_file = 'data.txt'; 

open my $fh, '<', $input_file or die $!; 

my @saved_entries; 

while (<$fh>){ 
    chomp; 
    next if /^\</; 
    next if /^\s*$/; 
    push @saved_entries, (split /\s/, $_)[1]; 
} 

for (@saved_entries){ 
    print "$_\n"; 
} 

...然後你就可以寫一個文件或者你需要什麼。

請注意,我在這裏過於詳細,以儘可能接近OP代碼。

+0

謝謝你們,現在已經解決了,但是爲什麼第一個打印 - 循環內部的打印給了我這個輸出:「text1.txt \t text2.txt \t text3.txt」?這裏沒有覆蓋? – Megiddo

+0

@Megiddo,因爲在循環中,您在下一次迭代覆蓋之前打印。 – stevieb

+0

如果不是第一個text1.txt,並且第二次迭代最終更改爲text2.txt並最終返回最終版本text3.txt?對不起,這是一個noob,但它真的讓我困惑。 – Megiddo

相關問題