如何编辑以下脚本从文本文件中获取数据?

时间:2014-10-17 14:36:13

标签: php

我想在我的剧本下面做两件事,我目前正在努力。

有关该功能的信息:目前它抓取最后20行,并根据行中请求的列显示信息。

前) 我想忽略包含相同列5和13的行。 示例:(下面的两行应该被忽略,因为第一行中的第5列与第13行匹配,第二行与第一行相同,因为第5列中的第一个名称与第13列的名称相匹配)

1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_user, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0 
1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,stackoverflow_user, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0 

二) 我想要包含保留字。与上述类似但我应该指定保留字:假设列 5或13或两者包含名称:STACK,它应该忽略这些行。

1,42,16, 201,STACK, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_usersecond, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0 
1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,STACK, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0
1,46,27, 201,[STACK | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,STACK, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0 

上面的所有行都应该被忽略,因为STACK位于第5列或第13列或两者中。

以下是我的实际功能:

    function DMMRankings()

    {
        # read a file into an array
        $lines = file('C:/path/to/file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        # take the last 20 lines of the file -- i.e. the last 20 values in the array
        $last_ten = array_slice($lines, -20);

        #create an array for the output
        $n = 1;
        $content = '';

        foreach ($last_ten as $l) {
            # treat the data as comma-separated values
            $arr = explode(",", $l);
            # if col 5 has multiple values, take the first one
            if (preg_match("/\[(.+?) \|/", $arr[4], $matches)) {
            $arr[4] = $matches[1];
            }
            # store the data we want in an output array.
            $data = array('rank-pos' => $n++, 'rank-name' => $arr[4], 'rank-dmuser' => $arr[12]);
        $content .= Template::Load('rankinguserdm-' . ($n % 2 == 1 ? 2 : 1), $data);
        }

        $this->content = Template::Load('user_rankingsdm', array('rankings' => $content));
    }

请帮我解决一下我目前的功能如何做到这一点。谢谢!

1 个答案:

答案 0 :(得分:0)

以下堆栈问题将为您提供有关阅读文件最后几行的最佳方式的简要说明,我看到了您的意见。

What is the best way to read lines from end of file

关于实际处理,它是CSV,请查看以下内置的PHP函数来创建数组:

str_getcsv

一旦你排序了这个:

/* This is just a one-liner to parse the file */
$aryCSV = array_map('str_getcsv', file('data.csv'));

foreach($aryCSV as $aryRow) {
    /* This is your "ignore check" */
    if(
        $aryRow[5] == 'STACK' &&
        $aryRow[13] == 'STACK'
    ) {
        /* Go to next iteration */
        continue;
    } 
    /* Do your template loading and data saving */        
}