1

問題:

PHP を使用してテキスト ファイルから特定の情報を抽出し、その情報に対して 2 つの配列を作成したいと考えています。

テキスト ファイルの例:

ここに画像の説明を入力

望ましい出力:

  1. /Perspective のキーワードは最初の配列にある必要があります: skincover、intelligence、legs
  2. 列のキーワードは2 番目の配列にある必要があります: 脚、スキンカバー、体重、知性、速度

/ で始まる列キーワードは無視する必要があります

これまでのコード:

<?php   
    $file = file('Creatures_rich.txt');

    foreach($file as $line_num => $line)
    {
        if (eregi("^/Perspective", $line))
             $perspective = explode(' ', trim(str_replace('/Perspective:', '', $line)));
    }

    echo "<xmp>".print_r($perspective, true)."</xmp>";
?>

これまでの出力:

Array
(
    [0] => skincover
    [1] => intelligence
    [2] => legs
)

2 番目の配列への取り組みからどのように開始しますか? どんなアイデアでも大歓迎です。どんなコード例でも大歓迎です。

4

1 に答える 1

1

解決

/Perspective:ラベルが付けられた行が 1 行だけで、先頭にある最初の行が\t列見出し行であると仮定します...

過剰なコメント (明確にするため)

$perspectives = array();              //Initialise perspectives array
$columns      = array();              //Initialise column names array
$text_file    = fopen('./file', 'r'); //Open file to handle

while($line = fgets($text_file)){                        //Read file line by line
    if(strpos($line, '/Perspective:') === 0){            //Check if '/Perspective:' is at start of string
        $perspectives = explode(' ', substr($line, 14)); // Remove first 14 characters: /Perspective: 
        continue;
    }
    else if(strpos($line, "\t") === 0){ //Check if first char in line is \t
        $columns = explode("\t", 
                            preg_replace("#\t/.+#", '', substr($line, 1)) //Remove commented column names and first \t
                          );
        break; // Break while loop after column names row
    }
 }

コメント解除されたコード

$perspectives = array();
$columns      = array();
$text_file    = fopen('./file', 'r');
while($line = fgets($text_file)){
    if(strpos($line, '/Perspective:') === 0){
        $perspectives = explode(' ', substr($line, 14));
        continue;
    }
    elseif(strpos($line, "\t") === 0){
        $columns = explode("\t", 
                            preg_replace("#\t/.+#", '', substr($line, 1))
                          );
        break;
    }
 }

入力ファイル

/Purpose: Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam, suscipit incidunt doloribus voluptatum dicta maxime accusantium animi eum vero eaque odit quae non quaerat possimus enim ad numquam consequuntur beatae.
/Origin: Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima, animi minus perspiciatis laudantium? Nostrum, aspernatur, sequi ratione assumenda fuga similique architecto deleniti sint recusandae voluptatibus numquam obcaecati ducimus eaque nisi.
/Rawdata: Unknown
/Perspective: skincover intelligence legs
/Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro, libero, accusamus laboriosam modi voluptatem facere quod unde atque perferendis laborum nisi omnis nihil cum minima quaerat. Quia, quaerat ipsa molestiae.
    legs    skincover   weight  intelligence    speed   /something  /else
dog 1   1   1   1   1   1   1
pig 1   1   1   1   1   1   1
human   1   1   1   1   1   1   1

サイドノート

好奇心から、あなたのコード ( Code A ) と私のコード ( Code B ) を比較して、どちらのパフォーマンスが優れているかを確認しました。

結果

実行時間:

Code A: 0.000108
Code B: 0.000044

コード B2.45454545451 倍高速で、すべての操作perspecitvesを実行し、column names

2 つのコードをあまり分析しなくても、違いの主な原因はファイルの処理方法にあると思います。

注意

比較を複数回実行しましたが、差はおおよそ から までの範囲でし2.2x2.7x

また、時間はどちらも非常に小さいので、大したことではありません...

于 2013-10-19T11:03:22.653 に答える