我想解析一个文件,并将其存储到PHP
中的Array
中。然而,有一些规则需要遵守:
- (p="value")应被忽略,但应保留
"value"
- 应忽略
-
- 应该忽略空白
- 被CCD_ 5和CCD_
示例字符串是:
NPD4196-2a_5_0
Geldanamycin - 0.166516 (p = 0.0068) Alamethicin - 0.158302 (p = 0.0206) 4-Hydroxytamoxifen - 0.1429 (p = 0.0183) Abietic acid - 0.133045 (p = 0.0203) Caspofungin - 0.130885 (p = 0.0432) Extract 00-303C - 0.12858 (p = 0.0356) U73122 - 0.113274 (p = 0.0482) Radicicol - 0.10213 (p = 0.0356) Calcium ionophore - 0.096183 (p = 0.0262)
因此,目标是生成一个数据结构,如:
Array('NPD4196-2a_5_0' => Array(Array( 0 => 'Geldanamycin', 1 => '0.166516', 2 => '0.0068'), Array( ... ));
到目前为止我已经写了这个。。。
while(($line = fgets($fp)) !== false){
$args = preg_split( '/['t'n (=) ]+/', $line, -1, PREG_SPLIT_NO_EMPTY );
if(count($args)){
print_r($args);
print "'n";
}
}
为了实现我的目标,我在其他方面缺少什么?感谢
(.+?)-'s*(['d'.]+)'s*'(p's*='s*(['d'.]+)')
这将获取第1组中的元素(例如格尔达霉素)、第2组中的相关值和第3组中的p值。
在此处使用正则表达式。
这似乎适用于一个键值对(假设NPD4196-2a_5_0是示例中的键,第二行是值)。
<?php
$fp = fopen('foo.txt', 'r');
$regex = '/('w*)'s*-'s*(['d'.]+)'s*'(p's*='s*(['d'.]+)')/';
$id = "NO ID";
$result = Array();
while(($line = fgets($fp)) !== false){
if (!preg_match($regex, $line)) {
$id = chop($line);
} else {
$all = Array();
while (preg_match($regex, $line, $matches, PREG_OFFSET_CAPTURE)) {
$last = end($matches);
$line = substr($line, $last[1] + strlen($last[0]) + 1);
$strings = Array();
for ($i = 1; $i < 4; $i++) {
array_push($strings, $matches[$i][0]);
}
array_push($all, $strings);
}
$result[$id] = $all;
}
}
print_r($result);
?>
(这是David B正则表达式的一个经过轻微编辑的版本。)
如果这条线与长RegEx模式不匹配,它将把这条线存储为ID。否则,它将与RegEx匹配,然后切掉匹配的部分。内部while循环的每次迭代都将匹配一个条目。由于我正在获取匹配的索引,所以for循环只用于将字符串添加到结果中。
此打印:
Array
(
[NPD4196-2a_5_0] => Array
(
[0] => Array
(
[0] => Geldanamycin
[1] => 0.166516
[2] => 0.0068
)
[1] => Array
(
[0] => Alamethicin
[1] => 0.158302
[2] => 0.0206
)
[2] => Array
(
[0] => Hydroxytamoxifen
[1] => 0.1429
[2] => 0.0183
)
...