PHP 从 txt 文件读取网表

PHP read Netlist from txt file

我有这种由原理图软件生成的txt文件的文件格式:

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

我需要得到这个:

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
    )

这是我尝试的代码,但我从输入字符串中获取了所有代码:

   $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>';

我需要在 ( 和 ) 之间读取并放入数组值...我尝试使用检查行是否以 ( 和 NETR 开头,如果是则放入数组...但我不知道如何获取number if items between ( and ) to get foreach loop to read values and put into array.

我哪里弄错了?代码可以更短吗?

试试这个,使用 preg_match_all:

$text = '(
NETR5_2
R6,1
R5,2
)
(
NETR1_2
R4,2
R3,1
R3,2
R2,1
R2,2
R1,1
R1,2
)';

$chunks = explode( ")(", preg_replace('/\)\W+\(/m',')(',$text) );
$result = array();
$pattern = '{([A-z0-9,]+)}';

foreach( $chunks as $row )
{
    preg_match_all( $pattern, $row, $matches );
    $result[] = $matches[1];
}

print_r( $result );

eval.in demo

我不是正则表达式之王,所以你可以找到更好的方法。 主要问题是括号:我不知道右括号和下一个左括号 ( )????( ) 之间是什么,所以首先我替换每个 space、制表符、cr 或 ln 之间,然后我展开字符串通过 )(.

我对结果数组的每个元素执行一个 foreach 循环,匹配每个出现的 A-z0-9, 并将检索到的值的数组添加到一个空数组,该空数组在 foreach 的末尾, 将包含所需的结果。

请注意:

主要模式基于提供的示例:如果值包含其他字符,则 A-z 0-9 , 正则表达式失败。

编辑:

/\)\W+\(/m

替换了初步的正则表达式模式

试试这个方法:

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

这给了我:

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

我们从 $current_index 0 开始。当我们看到 ( 时,我们在 $resistors_netlist[$current_index] 处创建一个新的子数组。当我们看到 ) 时,我们将 $current_index 递增 1。对于任何其他行,我们只需将其附加到 $resistors_netlist[$current_index].

的末尾