Perl:从文件读取,直到找到指定的字符

时间:2014-03-20 10:02:03

标签: perl

我有一个非常庞大的(10 GB)单行文件(基本上是insert语句),我无法加载到内存中。 我想处理那一行(做一些正则表达式)并取意义的全部值。

值以元组为单位(数据介于 - >(。*))。

所以我想从文件中读取每个元组并进行处理。

我在想的是使用这样的getc:

getc FILEHANDLE

所以我读了每个字符并检查它是否与我的元组结尾字符匹配(在我的情况下是这样),.。

是否有更有效,更好的方式以优化的方式执行此操作?

感谢。

2 个答案:

答案 0 :(得分:3)

你可以设置特殊的perl变量INPUT_RECORD_SEPARATOR $ /来匹配你的元组结尾字符。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/ say /;

open( my $fh, '<', 'foo.txt' ) or die;
my $tuple_ending_char = ')';
local $/ = $tuple_ending_char;

while (<$fh>) {
    say $_;
}

答案 1 :(得分:2)

您也可以尝试以下代码,但它不如davewood的解决方案那么优雅。

use strict;
use Data::Dumper;
my $filename='/tmp/sample.txt';
if (open(my $fh, $filename)) {
    my @file_stats = stat($fh);
    my $bytes_remaining = $file_stats[7];
    my $answer = "";
    my $buffer_size=1024;
    while (1) {
        my $bytes_read = read($fh, $answer, $buffer_size);
        my @tuples = ($answer =~ /\(.*?\),\s*/g);
        print Dumper(\@tuples);
        $answer =~ s/.*\)\s*,\s*([^\)]*)$/$1/g;
        $bytes_remaining -= $bytes_read;
        if ($bytes_remaining < 0) {$bytes_remaining = 0;}
        if (($bytes_read == 0) ||($bytes_remaining <= 0)) {
            last;
        };
    };
    close($fh);
}