文件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];
所以,我真的需要一个很大的帮助,我在这个问题上度过了最后两天...我希望,我解释得很好。
答案 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>";
}
}