一、把QQ群的聊天记录txt格式导出
消息管理器 -> 选择要导出的群 -> 右击、导出
这里要注意 : 导出之后的 文本是 unicode 编码的,需要转换 ==|| 之前不知道,搞了大半天。
重新建一个txt , 把原来的 txt 内容 复制 到 新的 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、
如果 聊天 内容 里面 出现 用户名,会 误以为 是 用户名 所在的行,把这行输出 并把 下一行 输出。