本工具可以从文件中按关键字提取数据和排序功能 [版本 0.88] BY Hong Wenjun
示例 1 :D:/>DataExtraction.exe "关键字" D:/原始数据.txt
示例 2 :D:/>DataExtraction.exe /W D:/原始数据.txt -S
示例 3 :D:/>DataExtraction.exe *** D:/原始数据.txt -S
请输入一个关键字!![ "关键字" *** /W /D ] 按四种方式选择一种
*** 关键字 提取所有数据,和-S参数配合排序
/W 关键字 匹配纯字母,不包含数字
/D 关键字 匹配全数字,不包含字母
-S 参数 排序优化,删除重复数据
D:/>DE /W D:/600W.txt -s //文件名改成DE.exe 方便使用
当前提取关键字:/W
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
原来数据记录数目:6583939 新的数据记录数目:3235633
提取数据花费时间:9.578 秒
正在排序优化中,请等候....
排序优化后数据量:2981874 排序数据花费时间:7.532 秒
正在把数据写到新文件中...... 如果数据重复,可以最后加参数 -S 优化排序
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<保存新数据文件花费时间:17.438 秒
已经生成新的包含关键字的数据文件 newData.txt
工程项目 源代码 和 VC 和 GC 编译的 可执行文件 下载地址
http://cid-0604030941ce925d.office.live.com/self.aspx/CPPSourceCode/DataExtractionV88.7z
源代码,就一个文件 DataExtraction.cpp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <fstream>
#include <sstream>
// #define WIN32 //VC 编译器开关
#include <time.h>
#ifdef WIN32
# include <windows.h>
#else
# include <sys\time.h>
#endif
#ifdef WIN32
int gettimeofday(struct timeval *tp, void *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm. tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
#endif /* WIN32 */
using std::stringstream;
using std::vector;
using std::string;
using std::fstream;
void help(); // 调用使用帮助
bool isdigit(const std::string& str); // overload function 重载函数
bool isalpha(const std::string& str);
stringstream & load_sstream(stringstream &oss, fstream &infile); // 加载文件到sstream
vector<string> & sortVecData(vector<string> & vecData); // 排序和删除重复
int main(int argc, char* argv[])
{
using namespace std;
if ((1 == argc)||(2 == argc)) { //错误输入处理
help();
return -1;
}
string Value = argv[1];
fstream inFile;
inFile.open(argv[2],ios_base::in);
if (!inFile) {
cerr << "文件错误:不能打开输入文件: " << argv[2] << endl <<endl ;
help();
return -1;
}
bool sortData = false; // 排序开关
if (argc >= 4 && ('s' == argv[3][1] || 'S' == argv[3][1])) {
sortData = true;
}
stringstream oss;
ofstream ofDataFile;
ofDataFile.open("newData.txt"); //保存到 新的数据档文件
long ixold = 0, ixnew = 0;
string::size_type pos;
string strData;
vector<string> vecData;
cout << "当前提取关键字:" << Value << endl;
// 取时间断点
timeval tv;
gettimeofday(&tv, NULL);
double cl = tv.tv_sec + (double)tv.tv_usec / 1000000;
// while(getline(cin , inFile)) //整行处理,以备修改
while (inFile >> strData) { //数据文件 数据输入
if ('/' == argv[1][0]) {
// /W 匹配纯字母,不包含数字
if (isalpha(strData) && ('w' == argv[1][1] || 'W' == argv[1][1] ) ) {
vecData.push_back(strData);
}
// /D 匹配全数字,不包含字母
if (isdigit(strData) && ('d' == argv[1][1] || 'D' == argv[1][1]) ) {
vecData.push_back(strData);
}
} else { //数据是否有关键字 Value *** 全部提取
if ('*' == argv[1][0]) {
vecData.push_back(strData);
} else {
pos = strData.find(Value);
if (pos != string::npos ) {
vecData.push_back(strData); //数据记录到容器
}
}
}
ixold++; //旧数据计数器
if (ixold % 100000 == 0) cout << ">";
}
gettimeofday(&tv, NULL);
cl = (tv.tv_sec + (double)tv.tv_usec / 1000000) - cl;
cout << "\n原来数据记录数目:" << ixold << "\t";
cout << "新的数据记录数目:" << vecData.size() << endl;
cout << "提取数据花费时间:" << cl << " 秒\n";
if (sortData) {
cout << "正在排序优化中,请等候....\n";
gettimeofday(&tv, NULL);
cl = tv.tv_sec + (double)tv.tv_usec / 1000000;
sortVecData(vecData); //数据排序 删除重复
cout << "排序优化后数据量:" << vecData.size() << "\t";
gettimeofday(&tv, NULL);
cl = (tv.tv_sec + (double)tv.tv_usec / 1000000) - cl;
cout << "排序数据花费时间:" << cl << " 秒\n";
}
cout << "正在把数据写到新文件中......\t如果数据重复,可以最后加参数 -S 优化排序\n" ;
gettimeofday(&tv, NULL);
cl = tv.tv_sec + (double)tv.tv_usec / 1000000;
vector<string>::iterator iter = vecData.begin();
while (iter != vecData.end()) {
oss << *iter++ << endl; //数据写到文件
if (ixnew++ % 100000 == 0) cout << "<"; //新数据计数器
}
ofDataFile <<oss.str();
gettimeofday(&tv, NULL);
cl = (tv.tv_sec + (double)tv.tv_usec / 1000000) - cl;
cout << "保存新数据文件花费时间:" << cl << " 秒\n";
cout << "\n已经生成新的包含关键字的数据文件 newData.txt" << endl;
inFile.close();
ofDataFile.close();
return 0;
}
// overload function 重载函数 isdigit
bool isdigit(const std::string& str)
{
bool flag=true;
for(std::string::size_type i=0; i<str.length(); i++) {
while(!isdigit(str[i])) {
flag=false;
break;
}
}
return flag;
}
bool isalpha(const std::string& str)
{
bool flag=true;
for(std::string::size_type i=0; i<str.length(); i++) {
while(!isalpha(str[i])) {
flag=false;
break;
}
}
return flag;
}
void help()
{
using std::cerr;
cerr << "本工具可以从文件中按关键字提取数据和排序功能 [版本 0.98] BY Hong Wenjun\n\n";
cerr << "示例 1 :D://>DataExtraction.exe \"关键字\" D://原始数据.txt \n" ;
cerr << "示例 2 :D://>DataExtraction.exe /W D://原始数据.txt -S\n" ;
cerr << "示例 3 :D://>DataExtraction.exe *** D://原始数据.txt -S\n\n" ;
cerr << "请输入一个关键字!![ \"关键字\" *** /W //D ] 按四种方式选择一种\n";
cerr << "*** 关键字 提取所有数据,和-S参数配合排序\n";
cerr << "/W 关键字 匹配纯字母,不包含数字\n";
cerr << "/D 关键字 匹配全数字,不包含字母\n";
cerr << "-S 参数 排序优化,删除重复数据\n";
}
stringstream & load_sstream(stringstream &oss, fstream &infile) // 加载文件到sstream
{
oss << infile.rdbuf();
return oss;
}
vector<string> & sortVecData(vector<string> &vecData) // 排序和删除重复 数字序列
{
sort(vecData.begin(), vecData.end()); //数据排序
vector<string>::iterator end_unique = unique(vecData.begin(), vecData.end()); // 移动重复到最后
vecData.erase(end_unique, vecData.end()); //删除重复
return vecData;
}