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 );
我不是正则表达式之王,所以你可以找到更好的方法。
主要问题是括号:我不知道右括号和下一个左括号 ( )????(
) 之间是什么,所以首先我替换每个 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]
.
的末尾
我有这种由原理图软件生成的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 );
我不是正则表达式之王,所以你可以找到更好的方法。
主要问题是括号:我不知道右括号和下一个左括号 ( )????(
) 之间是什么,所以首先我替换每个 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]
.