问题产生的背景:
用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文件 - 选择附件。
有了这些信息,我们直接输入中文,查找邮件联系人会很方便。