如何使用PHP获取CSV文件中的总行数?

tel*_*per 27 php csv row totals

如何使用PHP获取CSV文件中的总行数?我正在使用这种方法,但可以让它正常工作.

if (($fp = fopen("test.csv", "r")) !== FALSE) { 
  while (($record = fgetcsv($fp)) !== FALSE) {
      $row++;
  }

  echo $row;
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ill 56

这是另一个file()用于将整个文件读入数组,自动解析新行等的选项:

$fp = file('test.csv');
echo count($fp);
Run Code Online (Sandbox Code Playgroud)

另外,从PHP5开始,你可以传入FILE_SKIP_EMPTY_LINES...来跳过空行,如果你想:

$fp = file('test.csv', FILE_SKIP_EMPTY_LINES);
Run Code Online (Sandbox Code Playgroud)

手册: http ://php.net/manual/en/function.file.php

  • 这适用于小文件.如果你有一个巨大的CSV文件(GB大小),使用file()来读取整个文件和count()可能是一个坏主意,因为它将文件存储在内存中,并可能挂起一个低内存系统. (14认同)
  • @ xd6_ [这个答案](http://stackoverflow.com/a/21447450/2812842)对于大文件会更有效 (4认同)
  • 请注意,没有简单的方法可以覆盖 100% 的简单情况,因为 CSV 列的值可能包含换行符。这意味着要获得文件中“记录”的真实数量,您实际上必须解析文件。 (2认同)

Leo*_*nte 46

使用SplFileObject以下命令创建新文件引用:

$file = new SplFileObject('test.csv', 'r');
Run Code Online (Sandbox Code Playgroud)

尝试以seek最高的Int PHP可以处理:

$file->seek(PHP_INT_MAX);
Run Code Online (Sandbox Code Playgroud)

然后实际上它将寻找文件中可能的最高行,有最后一行,最后一行+ 1等于你的总行数:

echo $file->key() + 1;
Run Code Online (Sandbox Code Playgroud)

棘手,但这会避免你将文件内容加载到内存中,这在处理非常大的文件时是一件非常酷的事情.

  • 很棒,效果很好,这应该是最好的答案. (4认同)
  • 适用于 PHP >= 5.1 - 并且内存高效。使用`$file->rewind()` 返回到文件的开头。 (2认同)
  • @LeoCavalcante 我最终不得不使用这个标志组合来让它工作(在 Windows 上)`$file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);` (2认同)

Nou*_*l.M 13

尝试

$c =0;
$fp = fopen("test.csv","r");
if($fp){
    while(!feof($fp)){
          $content = fgets($fp);
      if($content)    $c++;
    }
}
fclose($fp);
echo $c;
Run Code Online (Sandbox Code Playgroud)


boe*_*ing 5

我知道这已经很老了,但实际上我遇到了同样的问题.作为一种解决方案,我假设使用linux特定的逻辑:

$rows = shell_exec('$(/bin/which cat) file.csv | $(/bin/which tr) "\r" "\n" | $(which wc) -l');
Run Code Online (Sandbox Code Playgroud)

注意:这仅适用于Linux,如果您100%确定您的文件没有多行单元格,则只应使用此选项


Jon*_*han 5

我觉得这个最靠谱:

$file = new SplFileObject('file.csv', 'r');
$file->setFlags(
    SplFileObject::READ_CSV |
    SplFileObject::READ_AHEAD |
    SplFileObject::SKIP_EMPTY |
    SplFileObject::DROP_NEW_LINE
);

$file->seek(PHP_INT_MAX);

$lineCount = $file->key() + 1;
Run Code Online (Sandbox Code Playgroud)