PHP Найти и удалить определенный набор строк в большом текстовом файле - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь удалить определенный набор строк на основе IPaddress в большом текстовом файле, ок. 60000 строк. Каждый набор строк начинается с MaxBytes [ipaddress] и заканчивается </TABLE>, а между каждым набором строк присутствует пустая строка. Существуют различия в строках таблицы в текстовом файле.

Пример строки набора:

MaxBytes[192.168.1.1]: 10000  <--start line
 <TABLE>
   <TR><TD>IP Address:</TD><TD>192.168.1.1</TD></TR>
   <TR><TD>Max Speed:</TD> <TD>300</TD></TR>
 </TABLE> <-- end line (Need to delete lines from start to end line)

Я пытаюсь найти начальную строку, используя приведенные ниже коды (поддерживаемые Yerke), но не могу найти способ найти следующий номер строки, содержащий тег </table>. Мне нужно выяснить начальный и конечный номер строки набора строк, содержащих определенный IP-адрес и удалить его.

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

коды:

<?php
$dir = "example.txt";
$searchstrt = "192.168.1.1";

///// find details
function find_line_number_by_string($dir, $searchstrt, $case_sensitive=false ) {
    $line_number = [];
    if ($file_handler = fopen($dir, "r")) {
        $i = 0;
        while ($line = fgets($file_handler)) {
            $i++;
            //case sensitive is false by default
            if($case_sensitive == false) {
                $searchstrt = strtolower($searchstrt);
                $line = strtolower($line);
            }
            //find the string and store it in an array
            if(strpos($line, $searchstrt) !== false){
                $line_number[] =  $i;
            }
        }
        fclose($file_handler);
    }else{
        return "File not exists, Please check the file path or dir";
    }

    return $line_number;
}

$line_number = find_line_number_by_string($dir, $searchstrt);
var_dump($line_number);
?>

Пример example.txt

MaxBytes[192.168.1.1]: 10000
 <TABLE>
   <TR><TD>IP Address:</TD><TD>192.168.1.1</TD></TR>
   <TR><TD>Max Speed:</TD> <TD>300</TD></TR>
 </TABLE>

MaxBytes[192.168.1.2]: 30000
 <TABLE>
   <TR><TD>IP Address:</TD><TD>192.168.1.1</TD></TR>
   <TR><TD>Max Speed:</TD> <TD>300</TD></TR>
   <TR><TD>Name:</TD> <TD>ABC</TD></TR>
 </TABLE>

MaxBytes[192.168.1.3]: 10000
 <TABLE>
   <TR><TD>IP Address:</TD><TD>192.168.1.1</TD></TR>
   <TR><TD>Max Speed:</TD> <TD>200</TD></TR>
   <TR><TD>Location:</TD> <TD>INDIA</TD></TR>
 </TABLE>

Я нашел обходной путь для получения номеров строк набора строк, содержащих желаемый IP-адрес. Кто-нибудь предлагает лучший способ сделать это.

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

$dir = "example.txt";
$searchstrt = "192.168.1.2";
$searchend = "</TABLE>";

///// find details
function find_line_number_by_string($dir, $searchstrt, $case_sensitive=false ) {
    $line_number = [];

    if ($file_handler = fopen($dir, "r")) {
        $i = 0;
        while ($line = fgets($file_handler)) {
            $i++;
            //case sensitive is false by default
            if($case_sensitive == false) {
                $searchstrt = strtolower($searchstrt);
                $line = strtolower($line);
            }
            //find the string and store it in an array
            if(strpos($line, $searchstrt) !== false){
                $line_number[] =  $i;
            }
        }
        fclose($file_handler);
    }else{
        return "File not exists, Please check the file path or dir";
    }

    return $line_number;
}

$line_number = find_line_number_by_string($dir, $searchstrt);
//var_dump($line_number);
$start = $line_number[0];

////////////////////////

function find_line_number_by_string1($dir, $searchend, $case_sensitive=false, $start)  {
    $line_number1 = [];
    if ($file_handler1 = fopen($dir, "r")) {
        $i = $start;
//      $i = 0;
        while ($line1 = fgets($file_handler1)) {
            $i++;
            //case sensitive is false by default
            if($case_sensitive == false) {
                $searchend = strtolower($searchend);
                $line1 = strtolower($line1);
            }
            //find the string and store it in an array
            if(strpos($line1, $searchend) !== false){
                $line_number1[] =  $i;
            }
        }

        fclose($file_handler1);
    }else{
        return "File not exists, Please check the file path or dir";
    }

    return $line_number1;
}

$line_number1 = find_line_number_by_string1($dir, $searchend, $case_sensitive=false, $start);
$first = $line_number[0];
$last = $line_number1[0];
//var_dump($line_number1);

for ($x = $first; $x <= $last; $x++) {
    echo "Line number to be delete : $x <br>";
}

?>

1 Ответ

0 голосов
/ 02 июля 2018

Я нашел решение своего вопроса. Я только что добавил еще несколько строк в свой существующий код. Теперь он работает нормально, как требуется.

$lines = file($dir, FILE_IGNORE_NEW_LINES);
for ($x = $first; $x <= $last; $x++) {
    echo "Line number to be delete : $x <br>";
    $lines[$x] = '';
     unset($lines[$x]);
}

//var_dump($lines);
file_put_contents($dir , implode("\n", $lines));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...