0

我试图从我的服务器中提取用户电子邮件地址。但问题是最大文件,.txt但有些是CSV带有 txt 扩展名的文件。当我试图读取和提取时,我无法读取带有 TXT 扩展名的 CSV 文件。这是我的代码:

<?php
$handle = fopen('2.txt', "r");
while(!feof($handle)) {
        $string = fgets($handle);
   $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/i';
   preg_match_all($pattern, $string, $matches);
   foreach($matches[0] as $match)
{
echo $match;
echo '<br><br>';
}
}
?> 

我试图为此使用此代码。该程序正在读取完整的 CSV 文件,并逐行读取文本文件。有成千上万的文件,因此很难识别。

请建议我应该怎么做才能解决我的问题?有没有可以读取任何格式的解决方案,那么它会很棒。

4

2 回答 2

1

那么你的文件是不同的。因此,您将不得不对每一个采取不同的方法。在更一般的术语中,这通常称为适应,并且主要使用适配器设计模式提供。

如果您使用适配器设计模式,您将有一个代码检查要打开的文件的扩展名,并分别switch使用其中一个txtcsv. Based on the value you would retrieve aTxtParser or aCsvParser`。

但是,在深入研究该领域之前,您可能需要先查看这些文件。如果没有看到结构,我不能肯定地说这个,但你可以。如果 text 和 csv 文件的内容相同,那么一个非常简单的方法是将所有文件的扩展名更改为 txt 或 csv,然后使用相同的逻辑处理它们,现在将处理具有相同扩展名的文件以相同的方式。

但据我了解,文件结构实际上有所不同。因此,为了使您的代码保持简洁的适配器模式,有两个单独的类/函数用于解析,另一个用于选择正确的解析函数(这个顶级函数实际上是一种策略形式)并运行它。

无论哪种方式,我都非常怀疑,因此您面临的问题有一个解决方案,因为文件结构主要是您自己的。

于 2017-05-04T07:30:22.347 回答
0

好的,所以问题是 CSV 文件的字符串行太长。基于此限制,我建议您使用php.net中的示例这是一个示例:

$handle = @fopen("/tmp/inputfile.txt", "r");

if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        echo $buffer;
        // do your operation for searching here
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}
于 2017-05-04T08:37:55.887 回答