问题产生的背景:
用foxmail发邮件时,填写收件人,每次输入别人的邮箱时要换成英文输入,有时还要得判断是不是我想找的那个人,确实麻烦。怎样将一份别人发过来的邮件中的收件人信息一次性全导入foxmail呢?
foxmail邮箱的联系人可用csv文件批量导入。

首先,在foxmai收件箱中找到文员的来信(他们通常会给很多人发送邮件),然后将联系人复制到一份txt文件中。比如:




copy:







然后处理这份

​cin.txt​​数据文件。


在vim编辑器中处理它,变成有规律的多行数据记录文件。


利用regular expression替换功能:


​%s/<\([a-z.@]*\)>, /^I\1^M/g​

黎    li@.com.cn
刘 liu@.com.cn
吴 wu@.com.cn
李 li@.com.cn
袁 yuan@.com.cn
赖 lai@.com.cn
胡 hu@.com.cn
陈 chen@.com.cn
魏 wei@.com.cn
王 wang@.com.cn
杨 yang@.com.cn
周 zhou@.com.cn
池 chi@.com.cn
毛 mao@.com.cn
叶 ye@.com.cn
叶 ye@.com.cn
周 zhou@.com.cn
赵 zhao@.com.cn
杨 yang@.com.cn
李<li@.com.cn>

用正则表达式处理了大部分数据,最后一行手动解决,除去​​<​​​ , ​​>​​。

xls文件

然后书写c代码生成xls文件。
在qt creator中输入以下代码

#include <stdio.h>
#include <stdlib.h>

int main(){
FILE *fp = fopen("cin.txt","r");
FILE *res = fopen("people.xls","w");
char *buff = (char *)malloc(100);
if(fp == NULL){
printf("cin.txt fopen failed.\n");
goto end;
}
if(res == NULL){
printf("xls fopen failed.\n");
goto end;
}
fprintf(res,"姓名\t电子邮件地址\n");
while(fscanf(fp,"%s",buff) != EOF){
fprintf(res,"%s\t",buff);
fscanf(fp,"%s",buff);
fprintf(res,"%s\n",buff);
}
end:
fclose(fp);
fclose(res);
free(buff);
return 0;
}

office Excel一般是以ANSI编码查看文件的
我们的qt creator是UTF-8编码的。
所以qt中的汉字输出到文件中可能产生乱码。
为了保证字符编码的统一,可以约定cin.txt,people.xls,main.c的编码都为ANSI编码。

记事本:
另存为 - 改变编码 - ANSI。
qt上修改:
编辑 - set encoding - GBK

然后编译运行即可,得到的xls文件用EXCEL打开,然后另存为csv即可。

csv文件

我们可以直接修改C程序生成CSV文件。 xls文件单元项是以​​\t​​​为分隔符的,而CSV文件是以​​,​​​为分隔符的。
所以新的代码为

#include <stdio.h>
#include <stdlib.h>

int main(){
FILE *fp = fopen("cin.txt","r");
FILE *res = fopen("people.csv","w");
char *buff = (char *)malloc(100);
if(fp == NULL){
printf("cin.txt fopen failed.\n");
goto end;
}
if(res == NULL){
printf("xls fopen failed.\n");
goto end;
}
fprintf(res,"姓名,电子邮件地址\n");
while(fscanf(fp,"%s",buff) != EOF){
fprintf(res,"%s,",buff);
fscanf(fp,"%s",buff);
fprintf(res,"%s\n",buff);
}
end:
fclose(fp);
fclose(res);
free(buff);
return 0;
}

在foxmail中点击左下角的联系人图标,然后选择右上角的目录图标,进一步操作:导入 - CSV文件 - 选择附件。
有了这些信息,我们直接输入中文,查找邮件联系人会很方便。