Search code examples
phptextpreg-matchpreg-match-allpreg-grep

How can I Extract values with information from big text file using php


I'm trying to get some data from text file, those data are repeated every random line

I'm trying to get this from text file, and there are alot of 2/6 blocks. i need to get them all, using aloop.

Example data I need to get it.

TRAFFIC MEASUREMENT REPORT PART     2/    6 VLR MEASUREMENT            VLRMEAS 

SAMPLE DATE:    FROM    2020-10-22 14:00:00:09
                TO      2020-10-22 15:00:00:13

REGISTERED SUBSCRIBERS:


LOCATION AREA CODE     CURRENT     AVERAGE        TMS1        TMS2        TMS3
       UNKNOWN LAC           2           2           0           0           0
               113       75868       75749           0           0           0
               115       40627       40732           0           0           0
              1102       70422       70489           0           0           0
              1105       87075       87067           0           0           0
              1117       56150       56180           0           0           0
              1118       67175       67444           0           0           0
              1120       74385       74381           0           0           0
              1121       65034       65060           0           0           0
              1122       21636       21407           0           0           0
              1217       22944       22856           0           0           0
              1218       49054       48993           0           0           0
              1318       24283       24066           0           0           0
              1418       16366       16350           0           0           0
              2118       17812       17674           0           0           0
              2120       79644       79489           0           0           0
TOTAL                   768477      767939           0           0           0

PART     2/    6
END OF REPORT

from big file (1/6 ,3/6 ect..).

I tried doing like this

    $lines = file($file,FILE_IGNORE_NEW_LINES);
    foreach ($lines as $line){
     if(strstr($line,'2/    6')){
         echo $line .'<br>';
     }elseif (preg_match('/(\w+)\s+(\d\end\:\report\d)\s+-->/', $line, $match)){
         print_r($match);
     }
    }

I get only one line from each block

TRAFFIC MEASUREMENT REPORT PART 2/ 6 VLR MEASUREMENT VLRMEAS
PART 2/ 6
TRAFFIC MEASUREMENT REPORT PART 2/ 6 VLR MEASUREMENT VLRMEAS
PART 2/ 6
TRAFFIC MEASUREMENT REPORT PART 2/ 6 VLR MEASUREMENT VLRMEAS
PART 2/ 6
TRAFFIC MEASUREMENT REPORT PART 2/ 6 VLR MEASUREMENT VLRMEAS
PART 2/ 6

I hope you get me well, I tried to find any answers but I couldn't find what I want.


Solution

  • One option is to use preg_match_all and file_get_contents and a pattern like:

    ^.*\d/\h*\d.*(?:\R.*)*?\REND OF REPORT\b
    

    Or use the exact digits in the pattern

    ^.*2/\h*6.*(?:\R.*)*?\REND OF REPORT\b
    
    • ^ Start of string
    • .*\d/\h*\d.* Match a line with a digit / optional spaces and a digit, then the rest of the line
    • (?:\R.*)*? Repeat as least lines as possible
    • \R Match a newline
    • END OF REPORT\b Match END OF REPORT and a word boundary to prevent a partial word match

    Regex demo | Php demo

    $file = "myfile.txt";
    $str = file_get_contents($file);
    $re = '`^.*\d/\h*\d.*(?:\R.*)*?\REND OF REPORT\b`m';
    preg_match_all($re, $str, $matches);
    print_r($matches[0]);
    

    Output will be an array with all the matched parts.


    Or another variation:

    ^.*\d/\h*\d.*(?:\R(?!END OF REPORT).*)*\REND OF REPORT\b
    

    Regex demo