数日前、PERL を使用してファイルから HTML を削除することについて質問しました。私は n00b で、質問への回答をサイトで検索しました...しかし、残念ながら何も見つかりませんでした...これはおそらく、私が n00b であり、回答が表示されなかったことが原因です。それを見ています。
それで、これが状況です。約 20 GB のテキスト ファイルを含むディレクトリがあります。各ファイルから HTML を取り除き、各ファイルを一意のテキスト ファイルに出力したいと考えています。以下のプログラムを作成しました。これは、ディレクトリ内の最初の 12 個のテキスト ファイル (合計で約 12,000 個のテキスト ファイルがあります) のトリックを行うようです...しかし、いくつかの問題に遭遇します。最初の問題は、12 番目のテキスト ファイルが解析された後、深い再帰に関する警告が表示され始めたことです...そして、この直後に、メモリが不足したためにプログラムが終了します。私のプログラミングは非常に非効率的だと思います。ですから、以下のコードで明らかなエラーが発生し、メモリが不足する可能性がある人がいるかどうか疑問に思っています。…私が物事を理解したら、うまくいけば私は貢献できるでしょう。
#!/usr/bin/perl -w
#use strict;
use Benchmark;
#get the HTML-Format package from the package manager.
use HTML::Formatter;
#get the HTML-TREE from the package manager
use HTML::TreeBuilder;
use HTML::FormatText;
$startTime = new Benchmark;
my $direct="C:\\Directory";
my $slash='\\';
opendir(DIR1,"$direct")||die "Can't open directory";
my @New1=readdir(DIR1);
foreach $file(@New1)
{
if ($file=~/^\./){next;}
#Initialize the variable names.
my $HTML=0;
my $tree="Empty";
my $data="";
#Open the file and put the file in variable called $data
{
local $/;
open (SLURP, "$direct$slash"."$file") or die "can't open $file: $!";
#read the contents into data
$data = <SLURP>;
#close the filehandle called SLURP
close SLURP or die "cannot close $file: $!";
if($data=~m/<HTML>/i){$HTML=1;}
if($HTML==1)
{
#the following steps strip out any HTML tags, etc.
$tree=HTML::TreeBuilder->new->parse($data);
$formatter=HTML::FormatText->new(leftmargin=> 0, rightmargin=>60);
$Alldata=$formatter->format($tree);
}
}
#print
my $outfile = "out_".$file;
open (FOUT, "> $direct\\$outfile");
print FOUT "file: $file\nHTML: $HTML\n$Alldata\n","*" x 40, "\n" ;
close(FOUT);
}
$endTime = new Benchmark;
$runTime = timediff($endTime, $startTime);
print ("Processing files took ", timestr($runTime));