2011-10-12 49 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输出文件到原始输入文件名。