2011-10-12 47 views
0

到目前爲止匹配的線,我想出如何使用該Perl模塊,,Text::CSV_XS匹配從CSV文件中的行。 我需要幫助的是刪除文件中的那一行。是否有捷徑可尋?在這個模塊中有沒有辦法做到這一點?去除使用CSV模塊在Perl

use strict; 
use warnings; 
use Text::CSV_XS; 

my @rows; 
my $csv = Text::CSV_XS->new ({ binary => 1 }) or 
    die "Cannot use CSV: ".Text::CSV_XS->error_diag(); 
open my $fh, "<:encoding(UTF-16LE)", "Test.txt" or die "cannot open file: $!"; 
while (my $row = $csv->getline ($fh)) { 

    if ($row->[0] =~ m/ABCDE/) 
    { 
     print "We have a match, remove the line \n"; 
    } 
    else 
    { 
     print "No match found\n"; 
    } 
} 
$csv->eof or $csv->error_diag(); 
close $fh; 

回答

2

它看起來並不像該模塊可以做到這一點,但也有一些其他的Perl模塊,可以:

見文檔和示例的鏈接。

+0

+1這也是我的建議。還有[Tie :: Array :: CSV](http://search.cpan.org/perldoc?Tie::Array::CSV),這似乎是最近更新的。 Tie :: CSV_File從2003年開始,可能會過時。 – TLP

0

我不知道,如果文本:: CSV_XS允許你刪除線。我不認爲它確實如此。
刪除線條的一種方法是當您在while循環中讀取線條時,只需存儲所需的線條。
關閉文件後,只需使用要保留在文件中的所有行覆蓋它即可。
因此,在你的情況下,任何與ABCDE不匹配的東西都應該保存,並在以後寫回到同一個文件中。
所以你最終會讀10行並寫回9(假設一行有ABCDE)。

2

從文件中刪除內容的唯一方法是讀取該文件,並寫出了新的內容。一個常見的方法是打開另一個文件進行寫入,從輸入文件讀取記錄,並只寫入希望保留到輸出文件的記錄。然後close兩者unlinkrename原(取決於你是否要保留一個備份),然後rename輸出文件到原始輸入文件名。