解析一个复杂的两个文件

时间:2015-02-23 20:25:17

标签: php arrays file parsing explode

文件1值:

....
Group   2012_fln
{
    vnum    103
    Type    mixed
    1   1167    1   2
    2   7731    1   2
    3   3561    1   2
    4   8613    1   3
}

Group   7612_edb
{
    vnum    104
    Type    other
    1   6312    1   90
    2   5241    5   45
....

文件2值:

....
1167    ºÎÈ°Àı´Ş°¿
7731    ÀÌÆÄÀÇ
3561    »¡°£»ö
....

所有值都已与TAB分开。顺便说一句,两个文件中都有数千个值。

所以这是我的问题:

我需要检查文件1上的值。文件2中是否存在。 如果文件2的值中不存在1167或7731或3561或8613值。

我需要在每个小组中这样做。如果不存在,我需要一个错误回声,比如;在xxx组中,xxx vnum不存在。并继续文件1的结尾。

我试图爆炸,但文件1中有如此多的语法,如Group,{},vnum,type等。我知道,这很复杂,这就是为什么我在这里写的。

我可以解析我的文件2值:

$line = trim($line);

$token = explode("\t", $line);

if ("" == $token[0] or "VNUM" == $token[0])
    continue;

$vnum = $token[0];
$entry_name = $token[1];

所以,我真的需要一个很大的帮助,我在这个问题上度过了最后两天...我希望,我解释得很好。

2 个答案:

答案 0 :(得分:1)

我建议使用正则表达式来解析数据,因为看起来每行都遵循某种格式。对于文件一,您可以设置类似

的表达式
^\t(\d+)\t(\d+)\t(\d+)\t(\d+)

这表示匹配一个标签,后跟至少一个数字字符,四次。任何与之匹配的行都是您关心的行。从那里,您对第二个分组感兴趣,或$2

对于文件二,您可能需要类似

的内容
^(\d+).*

这就是说,匹配至少一个开始该行的数字,然后是其他任何数字。所以,你关心第一个(也是唯一的)分组,$1

从第一个文件或第二个文件构造一个数字地图,然后迭代另一个文件中的匹配项并检查该地图。

由于您使用的是php,因此可以使用preg_match作为正则表达式http://php.net/manual/en/function.preg-match.php

答案 1 :(得分:0)

如果您需要的只是第二列,并且所有需要值的行的格式相同,请使用file_get_contents($file1)将文件加载到字符串中并匹配该模式(由空格分隔的4个数字)。

类似的东西:

preg_match_all('/^\s*\d+\s+(\d+)\s+\d+\s+\d+\s*$/m', $data, $matches);

$matches设置为如下数组:

Array
(
    [0] => Array
        (
            [0] =>     1   1167    1   2
            [1] =>     2   7731    1   2
            [2] =>     3   3561    1   2
            [3] =>     4   8613    1   3
            [4] =>     1   6312    1   90
            [5] =>     2   5241    5   45
        )

    [1] => Array
        (
            [0] => 1167
            [1] => 7731
            [2] => 3561
            [3] => 8613
            [4] => 6312
            [5] => 5241
        )

)

$matches[1]将是第二列中所有值的数组。您可以在$matches[1]上进行循环比较,以查看该值是否在第二个文件中。我建议先加载第二个文件并生成一个索引,这样当你循环匹配时,你可以检查是否array_key_exists($value, $file2Index)

示例,每个请求:

<?php
//read the first file in as a string
$file1 = file_get_contents("/path/to/file1");
//read the second file in as an array
$file2 = file("/path/to/file2");

//index from file2 that we are going to build
$file2Index = array();

foreach($file2 as $line){
    //split the line
    $line = explode("\t", $line, 2);
    //validate the line, should be only 2 values after explode and first should be a number
    if(count($line) == 2 && is_numeric($line[0])){
        //add to index
        $file2Index[$line[0]] = $line[1];
    }
}

//now get all the values from file1 that we want (second column)
preg_match_all('/^\s*\d+\s*(\d+)\s*\d+\s*\d+\s*$/m', $data, $matches);

$file1Values = array_unique($matches[1]);

//loop over the matches from column 2
foreach($file1Values as $value){
    //check if the key doesn't exist
    if(!isset($file2Index[$value])){
        //echo error message
        echo "Value {$value} does not exist in file2<br>";
    }
}