1

Arrayファイルを解析してin に保存したいPHP。ただし、遵守すべきいくつかの規則があります。

  • (p="value") は無視する必要がありますが、"value"保持する必要があります。
  • -無視する必要があります。
  • 空白は無視する必要があります。
  • \tと で割る\n

サンプル文字列は次のとおりです。

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";
        }
}

私の目標を達成するために他に欠けているものは何ですか?ありがとう

4

2 に答える 2

2

(.+?)-\s*([\d\.]+)\s*\(p\s*=\s*([\d\.]+)\)

That will grab the element (e.g. Geldanamycin) in group 1, the related value in group 2, and the p value in group 3.

Play with the regex here.

于 2012-07-29T00:45:33.937 に答える
1

これは、1 つのキーと値のペアで機能するようです (NPD4196-2a_5_0 が例のキーで、2 行目が値であると仮定します)。

<?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 ループの各反復は、1 つのエントリに一致します。一致のインデックスを取得しているので、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
                )
...
于 2012-07-29T00:58:20.523 に答える