1

私はこれをやろうとしています:

  1. 単一の単語の大きなファイルをFTPで転送します(〜144,000、1行あたり1単語)

  2. アップロードされたファイルを開き、最大 100 行で 1 行あたり 1 単語のファイルを作成する必要があります (01.txt、02.txt など)。

  3. 100 のファイルが作成された後、処理された 100 を元のファイルから削除したいと思います。

サーバーは共有されていますが、必要に応じてモジュールをインストールできます。

さて、私の知識は非常に限られているため、以下のコードは非常に粗雑です。1 つの問題は、ファイル全体を配列に開くことですか? 共有サーバーは、そのような大きなファイルを開いて一度にメモリに読み込むのに十分なメモリを備えていませんか? 最初の 100 行だけが必要です。以下は、ロードするのに十分小さいファイルを開き、配列に 100 行を取得するだけです。他には何もありません。私はそれを素早く入力したので、probにはいくつかの問題がありますが、私の限られた知識と助けの必要性を示しています.

 use vars qw($Word @Words $IN);
 my $PathToFile = '/home/username/public/wordlists/Big-File-Of-Words.txt';
 my $cnt= '0';
 open $IN, '<', "$PathToFile" or die $!;
 while (<$IN>) {
    chomp;
    $Word = $_; 
    $Word=~ s/\s//g;
    $Word = lc($Word);
    ######
    if ($cnt <= 99){
        push(@Words,$Word);
    }
    $cnt++;
}
close $IN;

本当にありがとう。

さて、私は以下のコードを実装しようとしています:

    #!/usr/bin/perl -w
BEGIN {
my $b__dir = (-d '/home/username/perl'?'/home/username/perl':( getpwuid($>) )[7].'/perl');
unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/x86_64-linux',map { $b__dir . $_ } @INC;
}
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print CGI::header();
my $WORD_LIST='/home/username/public/wordlists/Big-File-Of-Words.txt';
sed 's/ *//g' $WORD_LIST | tr '[A-Z]' '[a-z]' | split -l 100 -a6 - words.
print 'Done';
1;

しかし、私は得る:

syntax error at split-up-big-file.pl line 12, near "sed 's/ *//g'"
Can't find string terminator "'" anywhere before EOF at split-up-big-file.pl line 12.

最後に: うまくいく簡単な解決策を見つけました。美しくない:

    #!/usr/bin/perl -w
BEGIN {
my $b__dir = (-d '/home/username/perl'?'/home/username/perl':( getpwuid($>) )[7].'/perl');
unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/x86_64-linux',map { $b__dir . $_ } @INC;
}
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use diagnostics;
print CGI::header();
my $sourcefile = '/home/username/public_html/test/bigfile.txt';
my $rowlimit   = 100;
my $cnt= '1';
open(IN, $sourcefile) or die "Failed to open $sourcefile";
my $outrecno = 1;
while(<IN>) {
  if($outrecno == 1) {
  my $filename= $cnt.'.txt';
    open OUT, ">$filename" or die "Failed to create $filename";
      $cnt++;
  }
  print OUT $_;
  if($outrecno++ == $rowlimit) {
    $outrecno = 1;
    close FH;
  }
}
close FH;

ここで十分な情報が見つかりました。ありがとう...

4

3 に答える 3

2

興味深いと思われる非 Perl ソリューションがあります...

$ split -l 100 -a6 /home/username/public/wordlists/Big-File-Of-Words.txt words.

これにより、単語の大きなファイルが、それぞれ 100 行以下のファイルの束に分割されます。ファイル名は で始まりwords.、接尾辞は からaaaaaaまでzzzzzzです。したがって、、、、などがありますwords.aaaaaa。これらのファイルをすべてwords.aaaaabwords.aaaaac次のように単語リストに再結合できます。

$ cat words.* > reconstituted_word_list.txt

もちろん、スペースを削除し、単語をすべて同時に小文字にします。

$ WORD_LIST=/home/username/public/wordlists/Big-File-Of-Words.txt
$ sed 's/ *//g' $WORD_LIST | tr '[A-Z]' '[a-z]' | split -l 100 -a6 - words.

tr変換コマンドで、すべての大文字を小文字に変更します。はsplitファイルを分割しsed、スペースを削除します。

Unix の大きな強みの 1 つは、そのファイル処理機能です。大きなファイルを小さな断片に分割して再構成することは、一般的なタスクでした。大きなファイルを持っているかもしれませんが、フロッピーあたり 100K を超える容量を保持できないフロッピー ディスクがたくさんあります。UUCP を使用してこれらのファイルを別のコンピューターにコピーしようとしていて、ファイル転送サイズに 10K の制限があった可能性があります。FTP を電子メールで行っていて、システムが 5K を超えるファイルを処理できなかった可能性があります。

とにかく、あなたの場合、Perl スクリプトを書くよりもおそらく簡単な解決策であるため、私はそれを取り上げました。私は Perl の熱心なライターであり、多くの場合、Perl はシェル スクリプトよりも優れたタスクを高速に処理できます。ただし、この場合、これはシェルで処理するのが簡単なタスクです。

于 2013-05-07T15:06:14.187 に答える