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

Perl:从文件中读取,直到找到指定字符,perl,Perl,我有一个非常大的10 GB单行文件,基本上是insert语句,我无法加载到内存中。 我想处理这行代码,做一些正则表达式,并取完整的值 值位于tuplesdata中,介于->.*之间 所以我只想从文件中读取每个元组并对其进行处理 我想做的是像这样使用getc: getc FILEHANDLE 因此,我读取每个字符,并检查它是否与元组结尾字符匹配 是否有一种更有效、更好的方法以优化的方式执行此操作 谢谢。您可以设置特殊的perl变量INPUT\u RECORD\u SEPARATOR$/以匹配元组

我有一个非常大的10 GB单行文件,基本上是insert语句,我无法加载到内存中。 我想处理这行代码,做一些正则表达式,并取完整的值

值位于tuplesdata中,介于->.*之间

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

我想做的是像这样使用getc:

getc FILEHANDLE
因此,我读取每个字符,并检查它是否与元组结尾字符匹配

是否有一种更有效、更好的方法以优化的方式执行此操作


谢谢。

您可以设置特殊的perl变量INPUT\u RECORD\u 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 $_;
}

您可以设置特殊的perl变量INPUT\u RECORD\u 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 $_;
}

您也可以尝试以下代码,但它没有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);
}

您也可以尝试以下代码,但它没有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);
}

谢谢,没想到这个:D汉克斯,没想到这个:D