PHP: цикл по текстовому файлу и выделение строк, которые являются определенной "отправной точкой" - PullRequest
1 голос
/ 14 января 2011

Я пытаюсь сократить время редактирования в некоторых текстовых файлах, где приблизительно 10.000 строк текста, но мне нужно только около 200 или около того.

Текстовый файл опирается на почти определенный шаблон, но время от времени он отклоняется, но мой «фокус» для выбора нужной строки состоит в том, что строка всегда начинается с: z3455 и затем укажите переменную, например: z3455 http://url.com/data1/data1.1/data1.3/ (342kb)

У меня есть алгоритм для захвата URL-адреса и его содержимого, но теперь мне нужен какой-то способ перебрать текстовый файл, удалив все строки , кроме , который начинается с z3455 , а затем «Сдвиньте» их вместе, чтобы они были перечислены друг под другом.

Я пробовал разные подходы для этого в PHP, но не могу найти правильную функцию. Я могу «изолировать» определенный номер строки, но когда он отклоняется, я не могу полностью использовать этот подход.

Я надеюсь, что кто-то может мне помочь, либо предоставив код, либо направив меня в правильном направлении к тому, как я решу эту проблему.

Заранее спасибо

С уважением
- Местика

Ответы [ 3 ]

6 голосов
/ 14 января 2011
$in = fopen('file.txt', 'rb')
$out = fopen('filtered.txt', 'wb+')
while($line = fread($in)) {
    if (preg_match('/^z3455 http.*$/', $line)) {
         fwrite($out, $line);
    }
}

Конечно, если вы запускаете это из командной строки, вы можете просто пропустить PHP и использовать grep, что было бы гораздо эффективнее:

$ grep '^z3455 http' file.txt > filtered.txt
1 голос
/ 14 января 2011

Это должно сработать. substr должно быть быстрее, чем регулярное выражение, особенно для больших файлов.

foreach (file($file) as $line) {
    if (substr($line, 0, 5) != 'z3455') {
        continue;
    }
    // $line is now a line of text that starts with 'z3455.
    // Do with it whatever you need. If you want whatever comes
    // after z3455, you could then do $line = substr($line, 5);
}
0 голосов
/ 14 января 2011

только первая идея, которая у меня возникла (очень простая и непроверенная):

<?php
$filename = 'foo.txt';
$file = file($filename);
$matchedLines = array();

foreach($file as $line) {
  if(preg_match('/^z3455/', $line)) {
    $matchesLines[] = $line;
  }
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...