在Windows上计算PHP中的文件行

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
$file="largefile.txt";
$linecount = 0;
$handle = fopen($file,"r");
while(!feof($handle)){
  $line = fgets($handle);
  $linecount++;
}

fclose($handle);

echo $linecount;
  • 有没有人用这种方式使用大文件?

  • 有没有办法使用Windows命令来确定除PHP函数之外的文件大小?

  • 我按照评论中接受的答案的建议使用命令find


    也许你可以使用:

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

    哪个适用于所有地方。

    file()将文件读入数组,拆分换行符,count()计算数组的长度。

    如果它不能正常工作(例如在macintosh文件中),请看一下:http://www.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings


    这是使用substr_count并且比fgets快得多:

    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 +行进行基准测试,执行时间为:
    fgets:52.11271秒。
    substr_count(PHP_EOL):0.58844秒。
    substr_count(
    )
    :0.353772秒。
    find /c /v"" largefile.txt:100秒

    但是,如果主机系统上的可用内存没有问题,例如OP,并且设置了适当的PHP内存限制(大于文件长度),则substr_count可以搜索整个文件内容,具有很高的性能:

    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
    <?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));

    否则我会循环,特别是因为如果必须由许多进程执行操作。两种计数方式都循环遍历整个文件,但在第二种情况下内存大大增加。