以处理csv(内容含中文)为例,使用Encode 模块。因为csv如果包含中文,需要转码否则出现分割列的时候会出现错位。
use Encode qw /from_to/;
use Encode::Detect::CJK qw(detect);
sub test_csv {
my $file_name = $_[0];
my $table;
open(CSV, $file_name);
$first_line=1;
@titles = ();
while($_=<CSV>) { #读取一行
if($_ =~ /NULL$/){
next;
} else {
my $charset = detect($_); #检测当前编码格式
from_to($_,$charset,'utf-8'); #编码格式转为utf-8
s/"//g;
my @list = split /;/,$_;
my @tmps = split(/,/, $list[0]); #分割列
if ($first_line) {
$first_line = 0;
@titles = split(/,/, $list[0]);
next;
}
my $var;
my $i;
my $row_count = scalar(@titles);
for ($i = 1; $i < $row_count; $i++) {
$tmps[$i]=~s/[\r\n]//g;#去掉\r\n
$tmps[$i]=~ s/\s\s+//g;#去掉空格
$var->{$titles[$i]} = decode("utf-8",$tmps[$i]); #
}
$table->{$tmps[0]} = $var;
#print"$tmps[0]\n";
}
}
close(CSV);
return $table;
}