1

それは長い質問で、すべてを理解することはできませんでした。しかし、ここで MySQL を使用せずにファイルを使用して何かをしようとしています。好ましい方法ではありませんが、それを理解する必要があります。

1 - 1 つの列にある電子メールのファイルを開きたい。

email1@email.com
evail2@email.com
etail3@email.com

10万行になる可能性があります!

2- 次に、メールの最初の 2 文字を削除してフォルダーを作成します。("e/em" "e/ev" or "e/et" 例 *1 (! があれば当然))

3- 2 つの文字 *1 という名前の txt ファイルを作成します (! が存在する場合)。(パスの例 = e/em/em.txt e/ev/ev.txt および e/et/et.txt)

4- 上記の最初の 2 文字で始まる一意の電子メールをファイルに追加します。(したがって、e/em/em.txt には email1@email.com が含まれ、e/ev/ev.txt には evil2@email.com が含まれます。)

私はそれがナッツであることを知っています。しかし、それは私がする必要があることです。(私はMySQLにとても甘やかされています)。

これをやろうとする試みはとても惨めで時間がかかりました... 私は指導のためにここに来なければなりませんでした.

ファイル処理モジュールが役立つ場合は、喜んでインストールします。

*1 ディレクトリとファイルのチェックを毎回回避することが有益である場合は、可能なすべてのフォルダーを作成するスクリプトを実行し、事前に各フォルダーに空のファイルを入力したいと考えています。それぞれに 26 の可能な組み合わせ (/aa /ab /ac) を含む 26 のフォルダー (az) を作成し、すべてに適切な 2 文字の空白ファイルを作成します。

これらすべてを行う方法について、いくつかのレッスンが必要です。ばかげていますが、それでも方法を知る必要があります。

添加:

ディレクトリとファイル名は、実際には - または _ で始めることができます

まだ微調整が必​​要ですが、助けてくれてありがとう:

#!/usr/bin/perl -w
use strict;
use warnings;
use CGI;
use CGI ':standard';
print CGI::header();
use File::Basename;
use File::Path qw/make_path/;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
my $path='/home/xxxx/public_html/some/directory';
my $file='1.txt';
my %EmailAddresses;
  open my $IN, '<', $path.'/'.$file or die $!;
   while (<$IN>) {
   chomp;                
   $_=~ s/\s//g;
   undef $EmailAddresses{$_};
  }
for my $EmailAddress(keys %EmailAddresses) {
 ## need to sanitize substr here for use below
  my $filename= join '/', substr($EmailAddress,0,1), substr($EmailAddress,0,2), substr($EmailAddress,0,2) . '.txt';
  $filename = $path.'/'.$filename;
  my $dir = dirname($filename);
   make_path($dir) unless -d "$dir";
     open (OUT, '>>', $filename) || die $!;
     #need to check for dupes and remove other possible issues!
     print OUT $EmailAddress, "\n";
     close OUT;
  }
4

1 に答える 1

2

ハッシュを使用して一意の電子メールを取得しました。構造には冗長な手順がたくさんありますが、第2レベルのディレクトリを削除します。とにかく、その名前はファイル名と同じです。

#!/usr/bin/perl
use warnings;
use strict;

my %emails;
open my $IN, '<', '1.txt' or die $!;
while (<$IN>) {
    chomp;
    undef $emails{$_};
}

for my $email (keys %emails) {
    open my $OUT, '>>', join '/', substr($email,0,1), substr($email,0,2),
        substr($email,0,2) . '.txt' or die $!;
    print {$OUT} $email, "\n";
}

最初に電子メールをハッシュにグループ化し、次にファイルごとに印刷する方が高速です。

#!/usr/bin/perl
use warnings;
use strict;

my %emails;
open my $IN, '<', '1.txt' or die $!;
while (<$IN>) {
    chomp;
    undef $emails{substr($_, 0, 1)}{substr($_, 0, 2)}{$_};
}

for my $one (keys %emails) {
    for my $two (keys %{ $emails{$one} }) {
        open my $OUT, '>', join '/', $one, $two, $two . '.txt' or die $!;
        print {$OUT} "$_\n" for keys %{ $emails{$one}{$two} };
    }
}
于 2012-08-02T19:54:20.487 に答える