存档

文章标签 ‘php’

文件grep-选出两个文件中相同/不同的内容

2010年2月2日 闫鹏 没有评论

这个是最近做数据统计用的比较多的一个脚本,目的是根据key值,输出文件中相同或者不同的行。例如文件A的样子:

10000007^H_O
10000036^Hzerui
10000037^Hyanpeng_haha

文件B的样子:

10000037^Hyanpeng_haha

注意文件中的^H是一个字符,在vim中使用输入ctrl+v再输入ctrl+h就可以看到了,这里用它主要是起到文件不同列之间的分隔符作用

使用命令

php mygrep.php A B

可以得到“10000037^Hyanpeng_haha”这一行数据,使用命令

php mygrep.php A B “notmatch”

可以得到另外两行数据。

脚本默认使用第零列作为筛选依据,默认使用^H作为分隔符,在脚本中自己配置一下可以更改。脚本工作时,要求筛选依据是已排序的。对于排序,可以使用sort命令操作文件,sort通过-t参数指定分隔符,-f指定按照那一列进行排序。

mygrep.php的代码:

$base_file_name    = $argv[1];
$check_file_name   = $argv[2];
$mode			   = isset($argv[3])?$argv[3]:false;

$field_index = 0;
$delimiter = '';

//////////////////////////////////////////////////////////////
$base_file = @fopen($base_file_name, 'r');
$check_file = @fopen($check_file_name, 'r');
$read_base_file = true;
$compare_result = 0;
$readed_base_file_arr = array();

//以要检查的文件作为外层循环
while(!feof($check_file)){
	//读取要检查的文件
	$readed_check_arr = explode($delimiter, trim(fgets($check_file)));
	//var_dump($readed_check_arr);
	do{
		//读取基准文件
		if($read_base_file === true){
			$readed_base_arr = explode($delimiter, trim(fgets($base_file)));
			//var_dump($readed_base_arr);
		}

		//作比较
		//print("comparing check=".$readed_check_arr[$field_index]." base=".$readed_base_arr[$field_index]."\n");
		$compare_result = strcmp($readed_check_arr[$field_index], $readed_base_arr[$field_index]);
		$grep_flag = ($compare_result == 0);

		//如果是要取出不相等的数据
		//且检查key小于或等于基准key时,说明需要将检查key下移一行,即此比较key已经比较完成
		//此时如果比较结果相等则不输出,
		//如果比较结果不等,并且检查key大于基准key则输出,如果检查结果小于基准key,说明检查key要下移继续检查
		if($mode != false && (strcmp($mode, "notmatch") == 0)
			&& $compare_result >= 0){
			$grep_flag = !$grep_flag;
		}

		if($grep_flag){
			print implode($delimiter, $readed_base_arr)."\n";
		}

		//总是设置为要读取,如果跳出循环,则由外面设置
		$read_base_file = true;

	//如果检查的key是大于基准的key,并且检查文件未到尾,则重新读取一行基准文件进行检查
	}while($compare_result > 0 && !feof($base_file));

	if(feof($base_file)){
		break;
	}

	//当检查key小于基准key时,不读取下个基准key,等于则是因为已经比较过,两个都需要读取
	if($compare_result < 0){
		$read_base_file = false;
	}
}

fclose($check_file);
fclose($base_file);
分类: 程序员, 软件 标签:

php反射效果:基类访问子类数据

2010年1月18日 闫鹏 2 条评论

php不用学习直接使用的特点,使它迅速风靡起来,并且被很多不注意的人用烂。当然,它在设计之初就没有考虑采用很规范化的方式也是原因之一。最近在写代码的偷懒之余,偶然发现,基类是可以访问子类的数据的(php 5.2.6):

class base{

    protected $data_test1 = false;

    //FIXME 这个搞法太山寨了
    function set_data($name, $data){
        $this->$name = $data;
    }
}

class extend extends base{
    protected $data_test2 = false;

    function do_output(){
        var_dump($this->data_test2);
    }
}

$test_class = new extend();
$test_class->set_data("data_test1", "hello1");
$test_class->set_data("data_test2", "hello2");
var_dump($test_class);
$test_class->do_output();

看看结果就能知道,php没有将方法的作用范围与类严格的绑定在一起。不过这个对依赖注入的框架来说,这个算是好事了,只需要以数组的形式提供自己所需要的数据,框架用个foreach就给注入进去了。

分类: 程序员 标签: