1

这是一个很长的问题,我无法全部了解。但是,我正在尝试在没有 MySQL 的情况下做一些事情并使用文件。不是首选方法,但我需要弄清楚。

1 - 我想打开一个单列中的电子邮件文件。

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

可能是 100k 行!

2- 然后我想去掉电子邮件的前两个字符并创建文件夹。(“e/em”“e/ev”或“e/et”每个例子*1(如果!存在自然))

3- 创建一个 txt 文件,命名为两个字母 *1(如果!存在)。(路径示例 = e/em/em.txt e/ev/ev.txt 和 e/et/et.txt)

4- 使用以上述前两个字母开头的唯一电子邮件附加这些文件。(因此,e/em/em.txt 将包含 email1@email.com,e/ev/ev.txt 将包含 evail2@email.com 等)

我知道这很疯狂。但这就是我需要做的。(我被 MySQL 宠坏了)。

我这样做的尝试是如此痛苦和耗时......我只需要来这里寻求指导。

如果有帮助,我很乐意安装文件处理模块。

*1 如果每次都避免目录和文件检查是有益的,我想运行一个脚本来创建所有可能的文件夹,并提前用每个文件夹的空文件填充它们。创建 26 个文件夹 (az),每个文件夹包含 26 种可能的组合 (/aa /ab /ac),所有文件夹都包含创建的适当的两个字母的空白文件。

我需要一些关于如何做这一切的课程。虽然很傻,但我仍然需要知道如何。

添加:

目录和文件名实际上可以以 - 或 _ 开头

仍然需要调整,但感谢您的帮助:

#!/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

我使用哈希来获取唯一的电子邮件。但是,您的结构中有很多多余的步骤 - 我会删除二级目录,它的名称与文件名相同,无论如何。

#!/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 回答