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