كيف يمكنني فتح ملف من خط X إلى Y خط في PHP?

StackOverflow https://stackoverflow.com/questions/514673

  •  21-08-2019
  •  | 
  •  

سؤال

أقرب رأيت في مستندات بي ، fread() معين طول, ولكن هذا لا تحديد خط لبدء من.أي اقتراحات أخرى ؟

هل كانت مفيدة؟

المحلول

وأنت لن تكون قادرة على قراءة بدءا من خط X لخطوط يمكن أن يكون من طول التعسفي. لذلك سيكون لديك لقراءة من البداية عد عدد من خطوط قراءة للوصول الى خط X. على سبيل المثال:

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

نصائح أخرى

نعم ، يمكنك أن تفعل ذلك بسهولة مع SplFileObject::seek

$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
    echo $file->current(); 
    $file->next();
}

هذا هو أسلوب من SeekableIterator واجهة وينبغي عدم الخلط مع fseek.

ولأن SplFileObject هو iterable يمكنك أن تفعل ذلك حتى أسهل مع LimitIterator:

$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
}

مرة أخرى, هذا هو صفر ، حتى إنه خط 1001 إلى 2001.

للأسف, من أجل أن تكون قادرة على قراءة من x إلى y خط, كنت بحاجة إلى أن تكون قادرة على الكشف عن خط فواصل...و يجب أن تفحص من خلال الملف بأكمله.ومع ذلك ، على افتراض أنك لا يسأل عن هذا لأسباب تتعلق بالأداء ، يمكنك الحصول على خطوط x إلى y التالية:

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

انظر: array_slice

هنا هو الحل الممكن :)

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

حسنا، لا يمكنك استخدام وظيفة fseek السعي للحصول على موقف مناسب لأنه يعمل مع عدد معين من وحدات البايت.

وأعتقد أنه ليس ممكنا من دون نوعا من ذاكرة التخزين المؤقت أو يمر بها خطوط واحدا تلو الآخر.

إذا كنت تبحث عن خطوط ثم لا يمكنك استخدام fread لأن ذلك يعتمد على الإزاحة، وليس عدد من فواصل الأسطر. هل فعلا لقراءة ملف للعثور على فواصل الأسطر، لذلك وظيفة مختلفة هو أكثر ملاءمة. fgets وقراءة ملف خط سطرا. رمي في حلقة والتقاط فقط في الخطوط التي تريدها.

كنت خائفة من أن...اعتقد انها خطة ب ثم :S

لكل طلب اياكس أنا ذاهب إلى:

  1. قراءة في السلسلة عدد من خطوط أنا ذاهب إلى العودة إلى العميل.
  2. نسخ بقية من ملف إلى ملف مؤقت.
  3. عودة السلسلة إلى العميل.

انها عرجاء ، فإنه من المحتمل أن تكون بطيئة جدا مع 10 ، 000+ خطوط الملفات, ولكن أعتقد أنه أفضل من القراءة نفسها مرارا وتكرارا ، على الأقل الملف المؤقت هو الحصول على أقصر مع كل طلب...لا ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top