使用map处理文本: 将缩写转换成完整短语
2023年12月26日 2023年12月28日
为文本应用转换规则
会用到map的创建、关键字查找和遍历
输入
转换规则: 缩写到短语的映射
rule.txt
每条规则由两部分组成:缩写,用来替换该缩写的短语
缩写出现时,将其替换为对应的短语
短语可以包含多个单词
brb be right back k okay? y why r are u you pic picture thk thanks! l8r later
待处理文本
text.txt
where r u y dont u send me a pic k thk l8r
预期输出
where are you why dont you send me a picture okay? thanks! later
实现
函数 | |
---|---|
buildMap | 读取转换规则文件,保存到map对象 |
transform | 接受一个string,如果存在对应转换规则,返回转换后的内容 |
word_transform | 中控 |
bulidMap中,如果一个规则出现多次,以最后一条为准
1#include <string> 2#include <iostream> 3#include <fstream> 4#include <sstream> 5#include <map> 6 7using namespace std; 8 9map<string, string> buildMap(ifstream &map_file); 10const string &transform(const string &s, const map<string, string> &m); 11 12void word_transform(ifstream &map_file, ifstream &input) 13{ 14 auto trans_map = buildMap(map_file); // 读取转换规则 15 16 string text; 17 while (getline(input, text)) // 处理文本 18 { 19 istringstream stream(text); 20 string word; 21 bool firstword = true; 22 while (stream >> word) 23 { 24 if (firstword) 25 firstword = false; 26 else 27 cout << " "; 28 // 输出转换后的单词 29 cout << transform(word, trans_map); 30 } 31 cout << endl; 32 } 33} 34 35map<string, string> buildMap(ifstream &map_file) 36{ 37 map<string, string> trans_map; 38 string key, value; 39 while (map_file >> key && getline(map_file, value)) // getline不会跳过前导空格,value包含空格 40 if (value.size() > 1) 41 trans_map[key] = value.substr(1); // 减去空格; 从第一个字符开始 42 else 43 throw runtime_error("no rule for " + key); 44 return trans_map; 45} 46 47const string & 48transform(const string &s, const map<string, string> &m) 49{ 50 auto map_it = m.find(s); 51 if (map_it != m.cend()) 52 return map_it->second; 53 else 54 return s; 55} 56 57int main() 58{ 59 ifstream in("text.txt"), rule("rule.txt"); 60 // ifstream in, rule; 61 // in.open("text.txt"); 62 // rule.open("rule.txt"); 63 64 word_transform(rule, in); 65 66 in.close(); 67 rule.close(); 68 return 0; 69}