确定我当前使用的文件中的确切行数:
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;
有没有人使用大文件获得这种方式的经验?
有没有办法使用 Windows命令来确定除PHP函数之外的文件大小?
解决方案
我按照评论中接受的答案的建议使用命令find
。
答案 0 :(得分:2)
也许你可以使用:
$length = count(file($filename));
哪个可以在任何地方使用。
file()
将文件读入数组,拆分换行符,count()
计算数组的长度。
如果它无法正常工作(例如在macintosh文件中),请查看此处:http://www.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings
答案 1 :(得分: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()这么大的文件,它会将其完全读入内存,这可能会让您感到高兴,具体取决于您的情况。如果这是一次“我不在乎,这是我的工作站,我有足够的内存”情况或文件保证很小,那么你可以使用
count(file($loc));
否则我会循环,特别是因为如果必须由许多进程执行操作。两种计数方式都循环遍历整个文件,但在第二种情况下,内存大大增加。
答案 2 :(得分:0)
用于计算行号的Windows命令:
find /c /v "" < type file-name.txt
改编自Stupid command-line trick: Counting the number of lines in stdin。
答案 3 :(得分: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 +行的 Benchmark ,执行时间为:
•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 秒。