1

多くの人の名前、場所、生年月日を含む大きなテキスト ファイルがあります。文字サイズに基づいて名前を見つける必要があります。PHPでこれを行うにはどうすればよいですか?

テキスト ファイルでは、データは次のように編成されます。

    Name-Location                                 ID                   DOB
    Bob-LA                                        110                  12/01/1987
    Lia-CA                                        111                  11/09/1984
    Neil-LA                                       112                  17/10/1982
    Emon-CA                                       113                  07/12/1991
    Elita-CA                                      113                  13/06/1983
    Ron-CA                                        114                  16/02/1979
    and so on

ここで、特定のキャラクター名と同じ場所を持つ人々を検索したいと考えています (名前が 4 文字で、CA [Emon-CA] 出身のすべての人々を検索したいとします)。どうやってやるの?通常、探している文字列がわかっている PHP を使用してファイルを検索できます。しかし、ここでは、希望する結果を表示するための条件を設定する方法が実際にはわかりません。誰か助けてくれませんか?前もって感謝します。

4

2 に答える 2

2

あなたが試すことができます

$filename = "log.txt";

foreach ( new TextFileFilterIterator($filename) as $line ) {
    list($name, $location, $id, $dob) = $line;
    if (strlen($name) == 4 && $location == "CA") {
        echo implode(",", $line), PHP_EOL;
    }
}

出力

Emon,CA,113,07/12/1991

使用クラス

class TextFileFilterIterator extends ArrayIterator {
    private $filter;

    function __construct($filename) {
        parent::__construct(array_filter(array_map("trim", file($filename))));
    }

    public function current() {
        $c = array_filter(explode("   ", parent::current()));
        list($n, $l) = explode("-", array_shift($c));
        array_unshift($c, $n, $l);
        return array_map("trim", $c);
    }

}
于 2013-01-23T19:39:57.283 に答える
0

次のような正規表現を使用することをお勧めします。

// assume $text contains the contents of your text file
$namelength = 4; // change this as needed
$location = 'CA'; // again, change as needed

結果を数えたいだけなら

$count = preg_match_all('|^\s*([\w]{'.$namelength.'})-'.$location.'\s*(\d+)\s*(\d{2}/\d{2}/\d{4})$|',$text,$matches);

それ以外の場合、各試合で何かをしたい場合:

if(preg_match_all('|^\s*([\w]{'.$namelength.'})-'.$location.'\s*(\d+)\s*(\d{2}/\d{2}/\d{4})$|',$text,$matches)){
    foreach($matches as $match){
        $name = $match[1];
        $id = $match[3];
        $dob = $match[4];
        // Do something with each name.
    }
}
于 2013-01-23T19:15:48.790 に答える