xiaomm250 发表于 2019-05-06 15:10

perl处理Excel通讯录,得到vcard的vcf通讯录,分享一下

#用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,"<input.txt");#读取通讯录
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;
}


页: [1]
查看完整版本: perl处理Excel通讯录,得到vcard的vcf通讯录,分享一下