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 回答