一、文件编码问题:
日志格式可以为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(<FH1>)
{
chomp($_);
if($_=~/(.*)\s(\d*)/ && defined($wordhash{$1}))
{
print decode('utf8',$_),"\n";
$wordhash{$1} += $2;
$sumPV += $2;
}