簡體   English   中英

PHP從文件獲取X行數,直到完成

[英]PHP Get X Amount of Lines from File until Done

我有一個2000行的文本文件,並且需要連續循環一次獲取100行。 我可以使它工作,但是我必須手動更改每個100塊的$ i值。以下是代碼:

    $file = 'postcode_2000.txt';
    for ($i = 0; $i <= 99; $i++) {

        $str = str_replace(PHP_EOL, '', $file[$i]);
        $list[] = $str;

    }

    $list_json = json_encode($list);

我該如何迭代每次獲得下一個100?

將文件放入數組后,可以使用array_chunk() 首先將文件讀入數組:

$lines = 'postcode_2000.txt';

然后文件放入100個部分:

$chunks = array_chunk($lines, 100, true); // true keeps a set of consecutive line numbers

輸出將是這樣的:

Array
(
    [0] => Array
        (
            [0] => line in file
            [1] => line in file
            [2] => line in file
            [3] => line in file
            [4] => line in file
            ...
            [94] => line in file
            [95] => line in file
            [96] => line in file
            [97] => line in file
            [98] => line in file
            [99] => line in file
        )

    [1] => Array
        (
            [100] => line in file
            [101] => line in file
            [102] => line in file
            [103] => line in file
            [104] => line in file
            ...
            [194] => line in file
            [195] => line in file
            [196] => line in file
            [197] => line in file
            [198] => line in file
            [199] => line in file
        )

    [2] => Array
        (
            [200] => line in file
            [201] => line in file
            [202] => line in file
            [203] => line in file
            [204] => line in file
            ...
            [294] => line in file
            [295] => line in file
            [296] => line in file
            [297] => line in file
            [298] => line in file
            [299] => line in file
        )
    ...    
    [18] => Array
        (
            [1800] => line in file
            [1801] => line in file
            [1802] => line in file
            [1803] => line in file
            [1804] => line in file
            ...
            [1894] => line in file
            [1895] => line in file
            [1896] => line in file
            [1897] => line in file
            [1898] => line in file
            [1899] => line in file
        )

    [19] => Array
        (
            [1900] => line in file
            [1901] => line in file
            [1902] => line in file
            [1903] => line in file
            [1904] => line in file
            ...
            [1994] => line in file
            [1995] => line in file
            [1996] => line in file
            [1997] => line in file
            [1998] => line in file
            [1999] => line in file
        )

)

如果您真的想使用循環而不是array_chunk :)

<?php

$file = file('/tmp/postcodes_2000.txt');

$list = array();
$line_count = count($file);
$chunk_size = 100;
$current_line = 0;
echo "Line count: ${line_count}" . PHP_EOL;
while( $current_line < $line_count ) {
  $i = 0;
  $chunk = array();
  while($i < $chunk_size) {
    $str = str_replace(PHP_EOL, '', $file[$current_line]);
    $chunk[] = $str;
    echo "> Line ${current_line} : " . $file[$current_line] . PHP_EOL;
    $i++;
    $current_line++;
  }
  $list[] = $chunk;
}

$list_json = json_encode($list);
echo $list_json . PHP_EOL;

生成器非常適合當您計算大型集,並且您不想同時為所有結果分配內存,或者當您不知道是否需要所有結果時,由於結果的方式是在處理后,可以僅為當前結果分配內存,從而將內存占用空間降至最低限度。

因此,這是一種非常快速的方法,它消耗更少的內存來實現您的目標:

我們打開文件,讀取精確的行數,然后生成結果,同時保留下一次迭代的狀態,從而使您可以非常快速地處理塊,並減少內存消耗。

進行這種方式的好處是,在允許您最終(第三次)執行以下操作之前,避免兩次讀取所有文件以構建塊(一次讀取以構建包含所有行的大數組,然后循環遍歷該數組以構建塊)。遍歷大塊數組...

function file_get_x_lines($file,$amount=100){
    if(!file_exists($file)||!is_file($file)||!is_readable($file))
        return;
    if(!is_int($amount)||$amount<1) $amount=1;
    $handle=fopen($file,'rb');
        $i=0;
        while($line=fgets($handle)){
            if($i===0)
                $tmp=array();
            $chunks[]=rtrim($line,PHP_EOL);
            $i++;
            if($i===$amount){
                $i=0;
                $tmp=$chunks;
                $chunks=array();
                yield $tmp;
            }
        }
        if(!$line)
            yield $chunks; 

    }

然后就可以像使用任何發電機一樣使用它

foreach(file_get_x_lines(__FILE__) as $list)    {
    $list=json_encode($list);
    //do stuff
}

如果您想保持與行號相同的鍵,則可以通過以下方式輕松更改功能:

function file_get_x_lines($file,$amount=100){
        if(!file_exists($file)||!is_file($file)||!is_readable($file))
            return;
        if(!is_int($amount)||$amount<1) $amount=1;
        $handle=fopen($file,'rb');
            $i=0;
            $j=1;
            while($line=fgets($handle)){
                if($i===0)
                     $tmp=array();
                $chunks[$j]=rtrim($line,PHP_EOL);
                $i++;
                $j++;
                if($i===$amount){
                    $i=0;
                    $tmp=$chunks;
                    $chunks=array();
                    yield $tmp;
                }
            }
            if(!$line)
                yield $chunks; 

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM