特定用户QQ群聊天记录导出的实现
一、把QQ群的聊天记录txt格式导出
二、详细代码
1. head.h
#ifndef TxtSearch
#define TxtSearch #include<string>
#include<map>
#include<set>
#include<iostream>
#include<vector>
#include<fstream>
#include<sstream>
#include<ctype.h> typedef unsigned char BYTE;
typedef unsigned short WORD; bool IsChineseChar(WORD DoubleByte); void WordAndChar_print(std::string ); class TextQuery
{
public: typedef std::vector<std::string>::size_type line_no; void read_file(std::ifstream & );
std::set<line_no> run_query(const std::string&) const;
std::string text_line(line_no) const;
private:
void store_file( std::ifstream & );
void build_map(); std::vector<std::string> lines_of_text;
std::vector<std::string> bak_lines_of_text;
std::map< std::string,std::set<line_no> > word_map; }; void print_resluts(const std::set< TextQuery::line_no> & ,
const std::string & , const TextQuery &); #endif
2、function.cpp
#include"head.h" bool IsChineseChar(WORD DoubleByte)
{
return ( (DoubleByte < ) || (DoubleByte > ) );
} void TextQuery::read_file( std::ifstream & is)
{
store_file(is);
build_map();
} std::set<TextQuery::line_no> TextQuery::run_query(const std::string& str) const
{
std::map<std::string, std::set<line_no> >::const_iterator
loc = word_map.find(str); if(loc == word_map.end())
{
return std::set<line_no>();
} return loc->second;
}
std::string TextQuery::text_line(line_no line_num) const
{
if(line_num < lines_of_text.size())
return lines_of_text[line_num]; throw std::out_of_range("line num is out of range");
} void TextQuery::store_file(std::ifstream & is)
{
std::string txtline;
while(std::getline(is,txtline))
{
lines_of_text.push_back(txtline);
int len = txtline.length();
for(int i = ; i <len ; i ++) //pretreatment
{
bool b1 = ,b2 =;
if(!IsChineseChar(txtline[i])
&&!isalnum(txtline[i]) )
txtline[i] = ' ';
b1 = IsChineseChar(txtline[i]);
if(i + < len)
b2 = IsChineseChar(txtline[i+]);
} bak_lines_of_text.push_back(txtline);
}
} void TextQuery::build_map()
{
for(line_no line_num = ; line_num != bak_lines_of_text.size() ; ++line_num)
{
std::istringstream strline(bak_lines_of_text[line_num]);
std::string word;
while(strline >> word)
{
word_map[word].insert(line_num);
}
}
} void print_resluts(const std::set< TextQuery::line_no> & ss,
const std::string & str, const TextQuery &tq)
{
typedef std::set< TextQuery::line_no> lineset; lineset::size_type size = ss.size();
std::string path = str + ".txt";
std::ofstream outfine(path);
outfine<<str<<" occurs "<<size <<"times"<<std::endl;
lineset::const_iterator it = ss.begin(); for(; it != ss.end() ; ++ it)
{
outfine<<"\t( line "<<(*it)+<<" )"<<tq.text_line(*it)<<std::endl;
outfine<<"\t( line "<<(*it)+<<" )"<<tq.text_line(*it+)<<std::endl;
}
}
3、main.cpp
#include"head.h" int main()
{
std::ifstream infile("char.txt"); if(!infile.is_open())
{
printf("No input file!\n");
return -;
}
TextQuery tq;
tq.read_file(infile);
std::string query;
while (printf("enter user ID to look for:\n"),
std::cin>>query )
{
std::set<TextQuery::line_no> loc = tq.run_query(query);
print_resluts(loc,query,tq);
}
return ;
}
三、需要改进的地方
1、
for(; it != ss.end() ; ++ it)
{
outfine<<"\t( line "<<(*it)+<<" )"<<tq.text_line(*it)<<std::endl;
outfine<<"\t( line "<<(*it)+<<" )"<<tq.text_line(*it+)<<std::endl;
}
找到 用户名所在的行后, 我 直接把 用户名 所在的 下一行 作为 聊天内容,但其实 聊天内容里面 可以换行。
2、
如果 聊天 内容 里面 出现 用户名,会 误以为 是 用户名 所在的行,把这行输出 并把 下一行 输出。
特定用户QQ群聊天记录导出的实现的更多相关文章
- QQ群聊天记录文件分割
嗯,如题 是个蛋疼物 目前QQ的聊天记录导出功能很让人郁闷 三种聊天记录格式的导出 1 TXT 没图 2 BAK 只能再导入QQ使用 3 MHT 有图有字,缺点是一旦聊天记录很多,文件体积 ...
- 使用 R 语言挖掘 QQ 群聊天记录
1.获取数据 从 QQ 消息管理器中导出消息记录,保存的文本类型选择 txt 文件.这里获取的是某群从 2016-04-18 到 2016-05-07 期间的聊天记录,记录样本如下所示. 消息记录(此 ...
- 一梦江湖费六年——QQ群聊天分析
本文结构: 一.那些年我们加过的QQ群 二.数据读入和整理(一)--来自蓝翔的挖掘机 二.数据读入和整理(二)--你不知道的事 三.聊天宏观(1)--寤寐思服 三.聊天宏观(2)日月篇 三.聊天宏观( ...
- 安卓QQ聊天记录导出、备份完全攻略
发到知乎竟然被删掉,我也不知道我到底违反了哪条.唉,别人的毕竟是别人的.虽然博客园也是别人的 前言 我对聊天记录的备份比较执着,也在这上面折腾过不少.碰到过不少令人头疼的麻烦,在这里分享一下经验. 关 ...
- 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...
- 前端资料QQ群交流
转:https://github.com/jsfront/src/blob/master/qq.md 这本来是我QQ群内部的一份公共约定的日常交流规则,后来得到大伙的一致认可,并用实际行动来捍卫它,使 ...
- 关于iOS特定设别推送(特定用户推送)【原】
在这里,我就不哆嗦如何制作推送证书之类的了,网上一搜一大堆. 我们现在很多开发者的推送,就是集成第三方的推送SDK,然后通过第三方的推送平台帮我们进行推送.其实,这种推送(如JPush),一般只能广播 ...
- 我们是怎么管理QQ群的
文章背景:腾讯平台上的qq群数以千万百万计,但99%的在吹水扯蛋,从早上的问好开始,到晚上的晚安,无一不浪费青春之时间,看之痛心,无力改变,只好自己建了一个,希望能以此来改变群内交流的氛围或环境. 以 ...
- 关于玩QQ消息导入导出功能的感想!
今天玩了一下QQ的导入导出聊天记录的功能,感觉自己有些白痴,因为作为一个软件开发人员对自己平时使用的软件的功能掌握的不够,别说其他的任何东西了就连功能性的操作有些也不知道更别说熟练或精通了,这不是一个 ...
随机推荐
- ie6 7 8 9 firefox的css兼容问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MYSQL基础笔记(七)- 数据类型二
字符串类型 在SQL中,讲字符串类型分成了六类:char,varchar,text,blob,enum,set char,定长字符串 磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度. ...
- python(3)-动态参数实现字符串格式化
s1 = "{0} ===> {1}" s = s1.format('lilei', 'boy') print(s) l = ['lilei', 'boy'] s = s1. ...
- python(1) - 输入和输出
前面已经说过了,print()函数括号里加上字符串,就可以实现输出 >>> print('This is Python!') This is Python! print()函数也可以 ...
- Linux上安装MPEG-1 Layer3(mp3)解码器
今天突然想要在linux上播放音乐,但是打开之后发现缺少了解码器 于是去网上找了解决的方法,说得天花乱坠,不过有个帖子给出了很简单的方法. 以下内容转载于网络 上面提示没有安装解码器,这是因为版权问题 ...
- InvocationTargetException
在使用反射的适合,调用的方法无论抛出什么异常,都会变成InvocationTargetException,要想得到原始的异常,必须使用getTargetException()
- extjs的调试方法
1.使用extjs自带的测试工具 第一步:在ExtJS下载的资源包中,找到debug.js,将JS文件导入实际要运行的HTML或者JSP页面上 第二步:在有关JS文件代码中嵌入Ext.log('自定义 ...
- Angular 2.0 从0到1:Rx--隐藏在Angular 2.x中利剑
第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2.0 从0到1 (四)第五节: ...
- Jquery 全选、反选问题解析
最近工作中,需要使用Jquery实现复选框的全选和反选,本人虽然不是专职撸前端的,但这个小问题感觉也没什么难度,下面直接上代码: <div id="list"> < ...
- js中定义对象的方式有哪些?
1.对象直接量 2.构造函数 3.原型方法 4.动态原型方法