Search code examples
phparraysstrpos

PHP read Netlist from txt file


I have this file format of txt file generated from schematic software:

(
NETR5_2
R6,1
R5,2
)
(
NETR1_2
R4,2
R3,1
R3,2
R2,1
R2,2
R1,1
R1,2
)

I need to get this:

Array
(
    [0] => Array
    (
        [0] => NETR5_2
        [1] => R6,1
        [2] => R5,2
    )
    [1] => Array
        [0] => NETR1_2
        [1] => R4,2
        [2] => R3,1
        [3] => R3,2
        [4] => R2,1
        [5] => R2,2
        [6] => R1,1
        [7] => R1,2
    )

Here is code i try but i get all from input string:

   $file = file('tangoLista.txt');

    /* GET - num of lines */
    $f = fopen('tangoLista.txt', 'rb');
    $lines = 0;

    while (!feof($f)) {
        $lines += substr_count(fread($f, 8192), "\n");
    }

    fclose($f);

     for ($i=0;$i<=$lines;$i++) {

        /* RESISTORS - check */
            if (strpos($file[$i-1], '(') !== false && strpos($file[$i], 'NETR') !== false) {

        /* GET - id */
            for($k=0;$k<=10;$k++) {
            if (strpos($file[$i+$k], ')') !== false || empty($file[$i+$k]))                    {
            } else {
                $json .= $k.' => '.$file[$i+$k];
            }
        }
        $resistors_netlist[] = array($json);
    }
}

echo '<pre>';
print_r($resistors_netlist);
echo '</pre>';

I need to read between ( and ) and put into array values...i try using checking if line begins with ( and NETR and if yes put into array...but i don't know how to get number if items between ( and ) to get foreach loop to read values and put into array.

Where i im making mistake? Can code be shorter?


Solution

  • Try this approach:

    <?php
    $f = fopen('test.txt', 'rb');
    
    $resistors_netlist = array();
    
    $current_index = 0;
    while (!feof($f)) {
        $line = trim(fgets($f));
        if (empty($line)) {
            continue;
        }
    
        if (strpos($line, '(') !== false) {
            $resistors_netlist[$current_index] = array();
            continue;
        }
    
        if (strpos($line, ')') !== false) {
            $current_index++;
            continue;
        }
    
        array_push($resistors_netlist[$current_index], $line);
    }
    
    fclose($f);
    
    print_r($resistors_netlist);
    

    This gives me:

    Array
    (
        [0] => Array
            (
                [0] => NETR5_2
                [1] => R6,1
                [2] => R5,2
            )
    
        [1] => Array
            (
                [0] => NETR1_2
                [1] => R4,2
                [2] => R3,1
                [3] => R3,2
                [4] => R2,1
                [5] => R2,2
                [6] => R1,1
                [7] => R1,2
            )
    )
    

    We start $current_index at 0. When we see a (, we create a new sub-array at $resistors_netlist[$current_index]. When we see a ), we increment $current_index by 1. For any other line, we just append it to the end of $resistors_netlist[$current_index].