PHP nasıl Y hat hat X'den bir dosyayı açmak mı?

7 Cevap php

Ben PHP dokümanlar gördüğüm yakın, fread () belirli bir uzunluk için, ama o başlamak için hangi satırı belirtmek değildir. Başka bir öneriniz?

7 Cevap

Sen hatları keyfi uzunlukta olabilir, çünkü hat X başlayarak okumak mümkün olacak değildir. Yani çizgiler Örneğin X hat almak için okunan sayısını sayma baştan okumak zorunda kalacak:

<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
    $lineNo++;
    if ($lineNo >= $startLine) {
        echo $line;
    }
    if ($lineNo == $endLine) {
        break;
    }
}
fclose($f);

Ne yazık ki, y hat çizgisinden x okumak mümkün olması için, satır sonları tespit edebilmek gerekiyordu ... ve bütün dosya taramak gerekiyor. Ancak, not performans nedenleriyle bu konuda soran konum varsayarak, aşağıdaki ile y satırları x alabilirsiniz:

$x = 10; //inclusive start line
$y = 20; //inclusive end line
$lines = file('myfile.txt');
$my_important_lines = array_slice($lines, $x, $y);

Bkz: array_slice

Here is the possible solution :)

<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
    $lineNo++;
    if ($lineNo >= $startLine) {
        echo $line;
    }
    if ($lineNo == $endLine) {
        break;
    }
}
fclose($f);
?>

Peki, bu bayt verilen sayı ile çalışır, çünkü uygun pozisyon aramaya işlev fseek kullanamazsınız.

Ben önbellek veya hatları üzerinden birbiri ardına gidiyor çeşit olmadan mümkün olmadığını düşünüyorum.

Eğer çizgiler arıyorsanız bu hat sonları sayısı, ofset bir bayt değil dayanır çünkü o zaman fread kullanamazsınız. Aslında satır sonlarını bulmak için dosyayı okumak zorunda, bu yüzden farklı bir işlev daha uygundur. fgets dosya line-by-line okuyacaktır. Bir döngü içinde olduğunu atmak ve yalnızca istediğiniz satırları yakalamak.

Ben de bundan korkuyordum ... ben o zaman B planı var sanırım: S

: Her AJAX isteği için ben gidiyorum

  1. Bir dizeye ben müşteriye iade edeceğim hatlarının sayısını okuyun.
  2. Bir geçici dosyaya dosyasının rest kopyalayın.
  3. Müşteriye dize döndürür.

Bu topal, ve muhtemelen 10.000 + hatları dosyalar ile oldukça yavaş olacak, ama en azından geçici dosya yok ... her isteği ile kısa oluyor bu, tekrar tekrar aynı okumaktan daha iyidir sanırım?