PHP从txt文件中读取Netlist

时间:2016-02-15 23:13:38

标签: php arrays strpos

我有从原理图软件生成的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,如果是的话放入数组......但我不知道如何得到数字如果(和)之间的项目,以获取foreach循环以读取值并放入数组。

我犯错误的地方?代码可以缩短吗?

2 个答案:

答案 0 :(得分:1)

尝试使用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

我不是正则表达的王者,所以你可以找到更好的方法。 主要问题是括号:我不知道在结束和下一个开括号()????()之间是什么,所以首先我替换每个空格,tab,cr或ln之间,然后我通过{爆炸字符串{1}}。

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

请注意:

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

编辑:

A-z 0-9 ,

替换了preliminar正则表达式模式

答案 1 :(得分:1)

尝试这种方法:

<?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]的末尾。