Count lines of file in PHP on Windows
要确定我当前使用的文件中的确切行数:
1 2 3 4 | if(exec("wc -l".escapeshellarg($strFile), $arResult)) { $arNum = explode("", $arResult[0]); // ... } |
在Windows上执行相同操作的最佳方法是什么?
编辑:
另一个问题的尝试:
1 2 3 4 5 6 7 8 9 10 11 |
有没有人用这种方式使用大文件?
有没有办法使用Windows命令来确定除PHP函数之外的文件大小?
解
我按照评论中接受的答案的建议使用命令
也许你可以使用:
哪个适用于所有地方。
如果它不能正常工作(例如在macintosh文件中),请看一下:http://www.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings
这是使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $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," "); // also with , , or } fclose($handle); echo $linecount; |
代码考虑使用最少内存(2 MB块)。
使用85 MB文件和8M +行进行基准测试,执行时间为:
?
?
?
)
?
但是,如果主机系统上的可用内存没有问题,例如OP,并且设置了适当的PHP内存限制(大于文件长度),则
1 2 3 4 5 6 | $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秒。
用于计算行号的Windows命令:
1 | find /c /v"" < type file-name.txt |
改编自Stupid命令行技巧:计算stdin中的行数。
我更喜欢循环遍历文件,每次读取一行并递增计数器,使用和计数file()返回的数组仅适用于较小的文件。
1 2 3 4 5 6 7 8 9 10 11 12 |
如果你将file()用于这么大的文件,它会把它完全读入内存,这可能会让你望而却步。如果这是一次"我不在乎,这是我的工作站,我有足够的内存"情况或文件保证很小,那么你可以使用
否则我会循环,特别是因为如果必须由许多进程执行操作。两种计数方式都循环遍历整个文件,但在第二种情况下内存大大增加。