简化问题
先尝试对一个txt文件中的内容进行操作:
文件中的内容按行读取,以空格为分隔符进行分割,将其存入vector容器中(vectorres)。另外创建一个vector容器(vectorkeywords),用来存放关键字,进行关键字匹配(ret[8]==keywords[i]?),即可达到提取有效信息和剔除冗余信息的目的。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <fstream>
#include <string>
#include<vector>
using namespace std;
void printValue(vector<string>&s)
{
for (vector<string>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if ("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1]; //不要忘了
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while (p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
return res;
}
int main()
{
ifstream ifs("P0001.txt", ios::in);
ofstream ofs;
ofs.open("P0002.txt", ios::out);
if(!ifs)
{
cerr<<"open error"<<endl;
exit(1);
}
string s;
int index = 0;
while (getline(ifs, s))
{
//cout << s << endl;
vector<string> res = split(s, " ");
//printValue(res);
/*if (index > 1)
{
cout << res[8] << endl;
}*/
//system("pause");
vector<string> keywords;
keywords.push_back("small-vehicle");
keywords.push_back("large-vehicle");
keywords.push_back("plane");
keywords.push_back("ship");
keywords.push_back("harbor");
keywords.push_back("roundabout");
keywords.push_back("bridge");
keywords.push_back("helicopter");
keywords.push_back("container-crane");
if (index > 1)
{
for (int i = 0; i < keywords.size(); i++)
{
if (res[8] == keywords[i])
{
//printValue(res);
for (vector<string>::iterator it = res.begin(); it != res.end(); it++)
{
ofs << (*it) << " ";
}
ofs << endl;
}
}
}
else
{
//printValue(res);
for (vector<string>::iterator it = res.begin(); it != res.end(); it++)
{
ofs << (*it) << " ";
}
ofs << endl;
}
//system("pause");
index++;
}
ofs.close();
system("pause");
return 0;
}
//多了个换行符
//其次,需要解决批量的问题
下图是处理过后的对比图,红色部分为冗余信息,可以看出此番操作达到了提取有效信息和剔除冗余信息的目的。
美中不足的是:新生成的txt文件多了一个空白行,但是应该不影响数据的后续操作吧?
接下来要考虑的就是批量的问题。
说实话,有些事情只有自己亲手做了才知道问题出在哪里。
提取几个新的知识盲点:
#define _CRT_SECURE_NO_WARNINGS
字符串分割操作,切记先将要切割的字符串从string类型转换为char*类型。
先用getline()函数读行,再用split()函数进行分割,将分割过后的字符串存入容器。(不得不说,这个split()函数真的很好用)