2011-03-06 57 views
1

我試圖將CSV文件中的每一行與我使用Perl存儲在數組中的每個元素(字符串)進行比較。只有在數組中沒有任何字符串匹配的情況下,我纔想從CSV文件返回/打印到文件行。我試過很多種循環來達到這個目的,但是不僅沒有找到解決辦法,而且我的任何嘗試都沒有給我提供關於我哪裏出錯的線索。下面是我試過的控制環路的幾樣:如何僅返回不匹配數組的任何值的行?

while (<CSVFILE>) { 
    foreach $i (@lines) { 
     print OUTPUTFILE $_ if $_ !~ m/$i/; 
    }; #foreach 
}; #while 

AND:

foreach $i (@lines) { 
open (CSVFILE , "< $csv") or die "Can't open $csv for read: $!"; 
    while (<CSVFILE>) { 
    if ($_ !~ m/$i/) { 
     print OUTPUTFILE $_; 
    }; #if 
    }; #while 
close (CSVFILE) or die "Cannot close $csv: $!"; 
}; #foreach 

下面是CSV文件,我試圖樣本:

1,c.03_05delAAG,null,71... 
2,c.12T>G,null,24T->G,5... 
3,c.87C>T,null,96C->T,82.... 

而數組元素(帶正則表達式轉義字符):

c\.12T\>G 
c\.97A\>C 

假設只有上述作爲輸入數據,我希望回去:

1,c.03_05delAAG,null,71... 
3,c.87C>T,null,16C->T.... 

,因爲它們不包含任何從數組中的元素。這是Hashes發揮作用的情況嗎?除了標準的「詞典」定義之外,我還沒有很好地處理它們。如果有人能幫我解決這個問題,我將不勝感激。一這點我可能只是做手工,因爲沒有很多,我需要這一點的方式儘快,但因爲我無法找到任何答案,尋找其他地方我想這是值得的要價。

+2

使用嚴格;使用警告; – Tim 2011-03-06 13:00:02

+0

我有嚴格和警告設置,但我運行腳本時工作正常,但要麼提供空白CSV作爲輸出或只是重新打印原件。我在這裏錯過了一件非常明顯的事情嗎? – Nate 2011-03-06 13:04:40

回答

2

使用Perl 5.10.1或更好,這樣你就可以申請smart matching。 另外,在處理兩個循環時不要使用隱式的$_,它會變得非常混亂並且容易出錯。

下面的代碼(未經測試)可能做的伎倆:

use 5.010; 
use strict; 
use warnings; 
use autodie; 

... 

my @regexes = map { qr{$_} } @lines; 

open my $out, '>', $outputfile; 
open my $csv, '<', $csvfile; 

while (my $line = <$csv>) { 
    print $out $line unless $line ~~ @regexes; 
} 

close $csv; 
close $out; 

您的代碼不工作的原因,順便說一下,就是它會打印一條線,如果在這些單元的任意@lines不匹配,這將永遠是這種情況。

+2

「你的代碼不工作的原因...」哇,好的!我認爲這是我錯過的令人難以置信的顯而易見的事情。那麼,我顯然有一些閱讀/更新要做。我會在這裏發帖,看它是否奏效/一旦我把所有的東西都整理出來,什麼工作。謝謝你的迴應。令人沮喪的是,Perl可能有時候,社區是巨大的。謝謝 – Nate 2011-03-06 13:50:55