代码写得太好了,注释写得太好了,就不多介绍了!
代码写得没问题,但是上传上来后就有了问题(比如第35、36行),
具体原因应该是网站的问题,
-
#用perl处理Excel通讯录(从Excel复制到input.txt),最后形成vCard的
-
#vcf通讯录不乱码,传到手机QQ上,然后打开就可以导入通讯录联系人
-
#2019年5月6日
-
###############################################################
-
#input.txt文件格式如下:
-
#第一列姓名,第二列工作单位,第三列手机号,中间空格分开
-
#或者第一列姓名,第二列手机号,中间空格分开
-
###############################################################
-
#比如输入文件内容如下:
-
#张三 家里蹲公司 12345678901
-
#李四 1234567
-
###############################################################
-
#输出内容如下:
-
#BEGIN:VCARD
-
#VERSION:2.1
-
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E5=BC=A0=E4=B8=89;;;
-
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89
-
#TEL;CELL:12345678901
-
#ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=AE=B6=E9=87=8C=E8=B9=B2=E5=85=AC=E5=8F=B8
-
#END:VCARD
-
#BEGIN:VCARD
-
#VERSION:2.1
-
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=9D=8E=E5=9B=9B;;;
-
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=9D=8E=E5=9B=9B
-
#TEL;CELL:1234567
-
#END:VCARD
-
###############################################################
-
#检验网站:记得选择utf-8,而不是GB2312
-
#web.chacuo.net/charsetquotedprintable
-
###############################################################
-
use MIME::QuotedPrint;
-
use Encode;
-
use strict;use warnings;use diagnostics;
-
#先打开读取文件内容,保存到数组里面
-
open(FHa,');#读取通讯录
-
my @data=<FHa>;
-
close(FHa);
-
#输出结果
-
open(FHb,'>output_address.vcf');#输出通讯录
-
foreach my $line (@data)
-
{
-
chomp($line);
-
if($line=~m/^\s*(\S+)\s+(\S+)\s+(\d{7,12})\s*$/)#姓名,工作单位,手机号
-
{
-
my $name=gbbm($1);#姓名编码
-
my $corp=gbbm($2);#工作单位
-
print FHb "BEGIN:VCARD\n";
-
print FHb "VERSION:2.1\n";
-
print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
-
print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
-
print FHb "TEL;CELL:$3\n";#手机号
-
print FHb "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$corp\n";#工作单位
-
print FHb "END:VCARD\n";
-
}elsif($line=~m/^\s*(\S+)\s+(\d{7,12})\s*$/)#姓名,手机号
-
{
-
my $name=gbbm($1);#姓名编码
-
print FHb "BEGIN:VCARD\n";
-
print FHb "VERSION:2.1\n";
-
print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
-
print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
-
print FHb "TEL;CELL:$2\n";#手机号
-
print FHb "END:VCARD\n";
-
}else
-
{
-
print FHb "$line error88888888\n";#8个8,输出错误行的内容以及标志,方便搜索删除
-
}
-
}
-
close(FHb);
-
-
#子函数gbbm(改变编码),改变字符串编码,由于Windows上基本都是cp936复制粘贴,
-
#所以先把编码从cp936转化成utf-8,然后再转化成QUOTED-PRINTABLE
-
sub gbbm{
-
my($str)=shift(@_);
-
$str=encode("utf8",decode("cp936",$str));#编码转换
-
$str=encode_qp($str);#QUOTED-PRINTABLE
-
chomp($str);#如果有回车就删除掉
-
$str=~s/=$//g;#不知道末尾为什么多一个=号,多了就删除掉
-
return $str;
-
}
#用perl处理Excel通讯录(从Excel复制到input.txt),最后形成vCard的
#vcf通讯录不乱码,传到手机QQ上,然后打开就可以导入通讯录联系人
#2019年5月6日
###############################################################
#input.txt文件格式如下:
#第一列姓名,第二列工作单位,第三列手机号,中间空格分开
#或者第一列姓名,第二列手机号,中间空格分开
###############################################################
#比如输入文件内容如下:
#张三 家里蹲公司 12345678901
#李四 1234567
###############################################################
#输出内容如下:
#BEGIN:VCARD
#VERSION:2.1
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E5=BC=A0=E4=B8=89;;;
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89
#TEL;CELL:12345678901
#ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=AE=B6=E9=87=8C=E8=B9=B2=E5=85=AC=E5=8F=B8
#END:VCARD
#BEGIN:VCARD
#VERSION:2.1
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=9D=8E=E5=9B=9B;;;
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=9D=8E=E5=9B=9B
#TEL;CELL:1234567
#END:VCARD
###############################################################
#检验网站:记得选择utf-8,而不是GB2312
#web.chacuo.net/charsetquotedprintable
###############################################################
use MIME::QuotedPrint;
use Encode;
use strict;use warnings;use diagnostics;
#先打开读取文件内容,保存到数组里面
open(FHa,'
my @data=;
close(FHa);
#输出结果
open(FHb,'>output_address.vcf');#输出通讯录
foreach my $line (@data)
{
chomp($line);
if($line=~m/^\s*(\S+)\s+(\S+)\s+(\d{7,12})\s*$/)#姓名,工作单位,手机号
{
my $name=gbbm($1);#姓名编码
my $corp=gbbm($2);#工作单位
print FHb "BEGIN:VCARD\n";
print FHb "VERSION:2.1\n";
print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
print FHb "TEL;CELL:$3\n";#手机号
print FHb "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$corp\n";#工作单位
print FHb "END:VCARD\n";
}elsif($line=~m/^\s*(\S+)\s+(\d{7,12})\s*$/)#姓名,手机号
{
my $name=gbbm($1);#姓名编码
print FHb "BEGIN:VCARD\n";
print FHb "VERSION:2.1\n";
print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
print FHb "TEL;CELL:$2\n";#手机号
print FHb "END:VCARD\n";
}else
{
print FHb "$line error88888888\n";#8个8,输出错误行的内容以及标志,方便搜索删除
}
}
close(FHb);
#子函数gbbm(改变编码),改变字符串编码,由于Windows上基本都是cp936复制粘贴,
#所以先把编码从cp936转化成utf-8,然后再转化成QUOTED-PRINTABLE
sub gbbm{
my($str)=shift(@_);
$str=encode("utf8",decode("cp936",$str));#编码转换
$str=encode_qp($str);#QUOTED-PRINTABLE
chomp($str);#如果有回车就删除掉
$str=~s/=$//g;#不知道末尾为什么多一个=号,多了就删除掉
return $str;
}
阅读(256468) | 评论(0) | 转发(0) |