【问题标题】:Quickest Way to Read First Line from File从文件中读取第一行的最快方法
【发布时间】:2010-12-23 19:44:06
【问题描述】:

仅从文件中读取第一行的最快、最简单的方法是什么?我知道你可以使用file,但就我而言,浪费时间加载整个文件是没有意义的。

最好是单线。

【问题讨论】:

  • 想知道这是否可能(只读取文件的第一行而不加载任何“附加”)
  • 可能类似于$buffer = '';while(strpos($buffer, "\n")===false){$buffer .= fread($handle, 16);} $string = substr($buffer, 0, strpos($buffer, "\n"));
  • $line = (new SplFileObject($file))->fgets(); — 自 PHP 5.4.0 起可用的精美构造和调用方法语法。

标签: php file


【解决方案1】:

好吧,你可以这样做:

$f = fopen($file, 'r');
$line = fgets($f);
fclose($f);

这不是一行,但如果您将其设置为一行,那么您可能会因为错误检查而被搞砸,或者让资源打开的时间比您需要的时间长,所以我会说保留多行

编辑

如果您绝对知道该文件存在,则可以使用单行:

$line = fgets(fopen($file, 'r'));

原因是 PHP 为资源实现了RAII

这意味着当文件句柄超出范围时(在这种情况下,在调用 fgets 之后立即发生),它将被关闭。

【讨论】:

  • 为避免不需要的\n,您可能需要将trim() 添加到单行中。
【解决方案2】:
$firstline=`head -n1 filename.txt`;

【讨论】:

  • linux ftw。我想作为唯一的 1 班轮不足以获得答案投票......该死的微软!
  • 一个班轮可能就足够了,但对新手完全不友好的答案则不然。代码可能没问题,但如果有人需要这个答案,他/她可能不像他/她的靴子那样了解 PHP - 我使用 PHP 10 年了,不知道你的线路如何/为什么工作,因此永远不会在我的代码中使用它。一个解释会很好。
  • @Kalko,反引号将字符串作为shell命令在php中执行php.net/manual/en/function.shell-exec.php
  • @ssi-anik 该死的,我不知道。感谢您的解释。我建议您将此解释添加到答案本身,以便更多人理解。
  • 这种方法有两个问题: 1/ 问题是关于最快的方法,但反引号运算符意味着严重的开销。 2/ 如果你使用“head” unix 系统命令,你的代码将不再具有可移植性。
【解决方案3】:

让我印象深刻的是没有人提到 file() 函数:

$line = file($filename)[0];

或者如果 version_compare(PHP_VERSION, "5.4.0")

$line = array_shift(file($filename));

【讨论】:

  • “我知道你可以使用file,但就我而言,浪费时间加载整个文件是没有意义的。” :-)
【解决方案4】:
$line = '';
$file = 'data.txt';
if($f = fopen($file, 'r')){
  $line = fgets($f); // read until first newline
  fclose($f);
}
echo $line;

【讨论】:

    【解决方案5】:
    if(file_exists($file)) {
        $line = fgets(fopen($file, 'r'));
    }
    

    【讨论】:

      【解决方案6】:

      在现代 PHP 中使用 SplFileObject;

      $fileObject = new \SplFileObject('myfile');
      $line = $fileObject->current();
      

      补充信息

      使用SplFileObject,也很容易找行,例如跳过2行;

      $fileObject = new \SplFileObject('myfile');
      
      $fileObject->seek(2);
      $line = $fileObject->current();
      

      或读取前 10 行;

      $fileObject = new \SplFileObject('myfile');
      
      $lines = '';
      for ($i = 0; $i < 10 && $fileObject->valid(); ++$i) {
          $lines .= $fileObject->current();
          $fileObject->next();
      }
      

      【讨论】:

        【解决方案7】:

        您可以尝试fread 并声明要读取的文件大小。

        【讨论】:

          【解决方案8】:

          在我的一个项目(qSandbox)中,我使用这种方法来获取我读过的文本文件的第一行。 我的电子邮件模板位于文本文件中,主题位于第一行。

          $subj_regex = '#^\s*(.+)[\r\n]\s*#i';
          
          // subject is the first line of the text file. Smart, eh?
          if (preg_match($subj_regex, $buff, $matches)) {
              $subject = $matches[1];
              $buff = preg_replace($subj_regex, '', $buff); // rm subject from buff now.
          }
          

          【讨论】:

            【解决方案9】:

            fgets() 返回 " " 这是末尾的新行,但是使用此代码,您将得到第一行,而末尾没有 lineBreak:

            $handle = @fopen($filePath, "r");
            $text=fread($handle,filesize($filePath));
            $lines=explode(PHP_EOL,$text);
            $line = reset($lines);
            

            【讨论】:

              【解决方案10】:

              如果您不介意阅读整个文件,那么单行将是:

              $first_line = array_shift(array_values(preg_split('/\r\n|\r|\n/', file_get_contents($file_path), 2)));
              

              :)

              【讨论】:

              • OP:在我的情况下,浪费时间加载整个文件是没有意义的
              【解决方案11】:

              试试这个:

              $file = 'data.txt';
              $data = file_get_contents($file);
              $lines = explode
              

              【讨论】:

              • 你的答案不完整。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-08-17
              • 2011-04-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-06
              • 1970-01-01
              相关资源
              最近更新 更多