指望在Windows上的PHP文件的行

问题描述 投票:1回答:4

为了确定我目前使用的是文件行的确切数目:

if(exec("wc -l ".escapeshellarg($strFile), $arResult)) {
     $arNum = explode(" ", $arResult[0]);
     // ...
  }

什么是做同样的在Windows的最佳方式?


编辑:

从另一个问题的一个尝试:

$file="largefile.txt";
$linecount = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
  $line = fgets($handle);
  $linecount++;
}

fclose($handle);

echo $linecount;
  1. 有没有人有使用大文件,这样的经历吗?
  2. 是否有使用Windows命令来确定其他然后PHP函数文件大小的一种方式?

我用命令find去,因为建议中的评论接受的答案。

php windows numbers exec lines
4个回答
0
投票

我更愿意只遍历文件,读取一行每次和递增计数器,使用和计算由file()返回的数组是只为更小的文件好。

<?php

$loc = 'Ubuntu - 10.10 i386.iso';

$f = fopen($loc,'r');
$count = 0;

while (fgets($f)) $count++;

fclose($f);

print "Our file has $count lines" . PHP_EOL;

如果你会使用file()了这么大的文件时,它会读它完全到内存中,可以根据您的情况是禁止的。如果这是一个1次“我不关心,这是我的工作站,我有足够的内存”的局面或将文件,保证是小,那么你可以使用

count(file($loc));

否则,我倒是通过循环,特别是因为如果行动将不得不通过许多方法来进行。经历了整个文件,但内存的计数循环的两种方式在第二种情况下大大增加。


2
投票

也许你可以使用:

$length = count(file($filename));

这将在任何地方工作。

file()读取文件到一个数组,分割于换行符和count()计数阵列的长度。

如果不(在例如Macintosh文件)正常工作,看看这里:http://www.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings


0
投票

Windows命令来计算行号:

find /c /v "" < type file-name.txt

Stupid command-line trick: Counting the number of lines in stdin改编。


0
投票

这是使用substr_count,比fgets快得多:

$file="largefile.txt";
$linecount = 0;
$chunk_size = (2<<20); // 2MB chuncks

$handle = fopen($file, "r");

while(!feof($handle)){
    $chunk = fread($handle,$chunk_size);
    $linecount += substr_count($chunk,PHP_EOL);
    // $linecount += substr_count($chunk,"\n"); // also with \n, \r, or \r\n
}
fclose($handle);
echo $linecount;

该代码是考虑到使用至少存储器(2个MB组块)的。基准具有85 MB的文件和8M +线,执行时间为: •fgets:52.11271秒。 •substr_count(PHP_EOL):0.58844秒。 •substr_count(\n):0.353772秒。 •find /c /v "" largefile.txt:100秒。

然而,如果有与主机系统的可用内存,如OP没有问题,并在适当的PHP内存限制设置(不是文件长度大),substr_count可以搜索与多表现文件的全部内容:

$file="largefile.txt";
@ini_set('memory_limit', (2<<24)+(filesize($file)) ); // 32 MB for PHP + File size
$linecount = 0;
$handle = file_get_contents($file);
if($handle) $linecount = substr_count($handle, PHP_EOL);
echo $linecount;

你可以选择你想要的任何解释的内存大小。 基准测试:0.46878秒。

© www.soinside.com 2019 - 2024. All rights reserved.