解析csv文件并跳过前3000行

时间:2014-05-26 09:18:45

标签: algorithm perl parsing csv

我做了这个功能来修改我的csv文件:

    sub convert
{
    # open the output/input file 
my $file = $firstname."_lastname_".$age.".csv";
 $file =~ /(.+\/)(.+\.csv)/;
my $file_simple = $2;
open my $in, '<', $file or die "can not read the file: $file $!";
open my $out, '>', $outPut."_lastname.csv" or die "can not open the o file:  $!";

$_ = <$in>;

# first line
print $out "X,Y,Z,W\n";
while( <$in> )
{
    if(/(-?\d+),(-?\d+),(-?\d+),(-?\d+),(-?\d+)/)
    {
        my $tmp = ($4.$5);
        print $out $2.$sep.$3.$sep.$4.$sep.($5/10)."\n";
    }
    else
    {print $out "Error: ".$_;}
}
close $out;
}

我想跳过前3000行,我不知道这样做,这是我第一次使用perl。

谢谢。

1 个答案:

答案 0 :(得分:1)

由于您希望跳过前3000行,只需与current line number variable next if一起使用$.

use strict; use warnings;

my $skip_lines = 3001;

open(my $fh, '<', 'data.dat') or die $!;
while (<$fh>) {
    next if $. < $skip_lines;
    //process the file
}
close($fh);

由于$.检查当前行号,因此该程序只是告诉perl从第3001行开始,有效地跳过3000行。根据需要。

  

$。访问的最后一个文件句柄的当前行号。每   Perl中的文件句柄计算已读取的行数   它。 (根据$ /的值,Perl关于什么构成的概念   line可能与你的不匹配。)从文件句柄读取一行(通过   readline()或&lt;&gt; ),或当调用tell()或seek()时,$。   成为该文件句柄的行计数器的别名。您可以   通过分配$来调整计数器。 ,但这实际上不会   移动搜索指针。本地化$。不会本地化   文件句柄的行数。相反,它将本地化​​perl的概念   哪个文件处理$。目前是别名的。 $。当重置时重置   filehandle已关闭,但在重新打开文件句柄时则不会   没有干预关闭()。有关更多详细信息,请参阅中的I / O操作符   perlop得到。因为&lt;&gt;从来没有明确的关闭,行数增加   跨越ARGV文件(但请参阅eof中的示例)。你也可以使用   HANDLE-&gt; input_line_number(EXPR)访问给定的行计数器   文件句柄,无需担心你的句柄   访问。助记符:许多程序使用“。”表示当前行   号。

参考:

http://perldoc.perl.org/perlvar.html