【问题标题】:How to read any of the file type using php7?如何使用 php7 读取任何文件类型?
【发布时间】:2017-10-02 05:45:35
【问题描述】:

我试图从我的服务器中提取用户电子邮件地址。但问题是最大文件是.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 文件,并逐行读取文本文件。有成千上万的文件,因此很难识别。

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

【问题讨论】:

  • 还是没搞明白是什么问题?使用fgets,您可以逐行读取任何文件
  • @AlexSlipknot 任何文件,但如果文件扩展名被更改怎么办。我在TXT 文件中有一个CSV 文件。但是 CSV 文件的文件扩展名是.TXT。该程序无法读取文件,因此无法处理它。那么有没有一种方法可以读取除扩展名之外的任何文件。
  • fgets 可以读取 CSV,所以可能根本就不是 CSV?
  • @AlexSlipknot 它可以.... 毫无疑问。但我的程序是逐行阅读。我的文件大小为 9 GB。因此,我需要逐行读取文件。但是,CSV 文件试图一次获取所有内容,而不是逐行处理。因此,它发生了内存错误。

标签: php php-7 data-extraction php-7.1


【解决方案1】:

嗯,你的文件是不同的。因此,您将不得不对每一个采取不同的方法。在更一般的术语中,这通常称为适应,并且主要使用 Adapter design pattern 提供。

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

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

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

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

【讨论】:

    【解决方案2】:

    好的,所以问题是 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2016-02-08
      • 1970-01-01
      • 2011-05-14
      • 2011-05-05
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多