日志分析中文件编码问题以及读文件匹配问题总结

一、文件编码问题:

日志格式可以为UTF-8无BOM格式 或者 ANSI格式编码

因为UTF-8格式编码会导致出现一些奇怪的问题,比如,第一行的log或待匹配的关键字 查询不到。

原因是:UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。

切记。尤其是手动写了关键字列表需要去log中查找时一定要注意编码格式不要是UTF-8格式。

http://blog.sina.com.cn/s/blog_570f6d940100h3vk.html(UTF—8与UTF—8(无bom)格式相比有什么不同

二、读文件匹配过程编码问题:

读文件后,在匹配的时候注意是应该用“正则表达式”还是用“eq”。

前几天做一个词条pv统计的工作,两种方式得到的结果不一样。找了很久的原因,各种编码方式换来换去的试用啊,最后的原因为:

1、keywords.txt的编码改为UTF-8无BOM格式,两种方式的PV差距缩小了一些。

2、将使用re匹配的规则换用eq来比较,两种方式的PV结果一样了。

汗啊~~~


三、附属对比代码:

1、笨方法:

$_ = decode('utf8',$_);
#if( $_ =~/(北京首都机场宾馆|广州维景大酒店|德胜酒店|三亚万豪度假酒店|伯瓷酒店|竹湾酒店|葡京酒店|凯悦酒店|华威酒店|灵山大佛|鼋头渚|东部华侨城|张家界|周庄|象鼻山|千岛湖\[杭州\])	(\d+)/){###开始导致PV值大的原因
if( $_ =~/(.*)	(\d+)/){
	if($1 eq "北京首都机场宾馆"|$1 eq "广州维景大酒店"|$1 eq "德胜酒店"|$1 eq "三亚万豪度假酒店"|$1 eq "伯瓷酒店"|$1 eq "竹湾酒店"|$1 eq "葡京酒店"|$1 eq "凯悦酒店"|$1 eq "华威酒店"|$1 eq "灵山大佛"|$1 eq "鼋头渚"|$1 eq "东部华侨城"|$1 eq "张家界"|$1 eq "周庄"|$1 eq "象鼻山"|$1 eq "千岛湖[杭州]"){####后来正确的PV值
		my ($doc_title, $doc_pv) = ($1,$2);
		print $doc_title."\t".$doc_pv."\n";
		$docInfo{$doc_title}{'pv'}+=$doc_pv;
		$totalNum+=$doc_pv;
}}

2、效率高的方法,切记,keywords.txt的编码格式要为 UTF-8无BOM格式.

while()
{
	chomp($_);
	if($_=~/(.*)\s(\d*)/ && defined($wordhash{$1}))
	{
		print decode('utf8',$_),"\n";
		$wordhash{$1} += $2;
		$sumPV += $2;
	}




你可能感兴趣的:(日志分析中文件编码问题以及读文件匹配问题总结)