六一的部落格


关关难过关关过,前路漫漫亦灿灿。



为文本应用转换规则

会用到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}

使用map处理文本: 将缩写转换成完整短语


为文本应用转换规则

会用到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}