C++ 提取、整理数据的工具

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <map>
#include <assert.h>
#include <io.h>
#include <windows.h>  
#include <direct.h>
#include <io.h>
#include<iomanip>


using namespace std;


int ID_SIZE=5;//根据相应的模式进行选择


enum MyEnum
{
/**********0x53,83,01,71,88,45 *********后面有空格和没有空格都行
***********2641                      *********
***********AE11                      ********/
ONE_MODE = 0X01,
/********0x03,02,01,71,90,0 2641 AE11 ****/
MUL_MODE = 0X02,


/*****************后续有新模式自己添加*********************/
MIS_MODE = 0x10,
};


struct DADE
{
vector<string>vctMyDateList;
};


struct MyDate
{
string strId;
DADE date;

};
/********模式二用到的数据*************/
struct MyDateTwo
{
string strID;
string strAdd;
string str1;
string str2;


};


/*************************模式一的实现方式*********************/
bool fnIsHeadLine(string str)
{
if (str.substr(0,2)!="0x") //首选确认首行是否0x开头
{
return false;
}
else 
{

for (int i = 0; i < str.size(); i++)
{
if (str[i]=='\t')
{
return false;
}
}




unsigned int iPos = str.find_first_of(",");
if (str.substr(0,iPos).size()==4)
{
str = str.substr(2); //切掉0x
string strlend = ",";
unsigned int iPos =str.find(strlend);
while (iPos !=string::npos)
{
string strRase = str.substr(0,iPos);
str = str.substr(iPos+strlend.size());
iPos = str.find(strlend);
if (strRase.size()!=2)
{
return false;
}
}


return true;
}
else 
{
return false;
}
}
}


string fnGetIdFromStr(string str)
{
//带0x的返回
string strResult = "";
string strNew = str.substr(2); //切除0x


string strlend = ",";
unsigned int iPos = strNew.find(strlend);
int i = 0;


while (iPos!=string::npos)
{
strResult += "0x";
strResult += strNew.substr(0,iPos);
strResult += ",";


strNew = strNew.substr(iPos+strlend.size());
iPos = strNew.find(strlend);
i++;
}

// for (int i=0; i<ID_SIZE; i++)
// {
// strResult += "0x";
// strResult += strNew.substr(i*3,2);
// if (i!=(ID_SIZE-1))
// {
// strResult += ",";
// }
// }
strResult = strResult.substr(0,strResult.size()-1);
return strResult;
}


string fnGetFirstLineDate(string str)
{
string strResult = " ";
string strNew = " ";
char LastChter = str.at(str.size()-1);
if (LastChter!='\0')
{
strNew = str.substr(0,str.size());
}
else
{
strNew = str.substr(0,str.size()-1); //去掉最后一个空格
}

int iPos = strNew.find_last_of(",");
if (iPos!=string::npos)
{
strResult =strNew.substr(iPos+1);//从逗号开始取到结尾
}
return strResult;
}


void fnReadFile(vector<MyDate> &vct,string strFilename)
{
ifstream fin(strFilename.c_str());
if (fin.bad())
{
cout<<"Error when open file!"<<endl;
return;
}
string str ="";
while (getline(fin,str))
{
if (str!="")
{
if (fnIsHeadLine(str))
{
MyDate myDate;
myDate.strId=fnGetIdFromStr(str);
myDate.date.vctMyDateList.push_back(fnGetFirstLineDate(str));
vct.push_back(myDate);
}
else
{
if (vct.size()<1)
{
continue;
}
MyDate &myDate = vct[vct.size()-1];


char LastChter = str.at(str.size()-1);
if (LastChter!='\0')
{
str = str.substr(0,str.size());
}
else
{
str = str.substr(0,str.size()-1); //去掉最后一个空格
}
myDate.date.vctMyDateList.push_back(str/*.substr(0,str.size()-1)*/); // 去掉最后的空格
}
}
}
fin.close();
return;
}


void fnWriteFile(vector<MyDate> &vct,string strFilename)
{
ofstream fout(strFilename.c_str());
if (fout.bad())
{
cout<<"Error when write file !"<<endl;
return;
}
for (unsigned int i=0;i<vct.size();i++)
{
fout<<vct[i].strId<<"\t"; //把这行的ID输出
for (unsigned int j=0;j<vct[i].date.vctMyDateList.size();j++) //这个容器数组进行遍历
{
fout<<"\""<<vct[i].date.vctMyDateList[j]<<"\""; //ID后面的字符依次输出
if (j!=(vct[i].date.vctMyDateList.size())-1)
{
fout<<","; //每输一个字符加逗号
}
}
fout<<"\n"; //一行输出完时加换行符
}
fout.close();
return;
}


#if 0
//获取当前路径下所有.txt文件命和路径名
vector<string> FindFile(string fileName, string filePath)
{
vector<string>vct;
vct.clear();


string strFileName = "";
assert(fileName != "" && filePath != "");
string exeName = fileName.substr(fileName.find_last_of('.'));
string strPath = filePath;
string filiterName = "*.*";
if ( strPath[strPath.length() - 1] != '\\')
{
strPath = strPath + "\\";
}
_finddata_t fileInfo;
long handle = _findfirst((strPath + filiterName).c_str(), &fileInfo);
if (handle == -1L)
{
cout<<"Cannot Open The Path!"<<endl;
return vct;
}
do
{
string path = fileInfo.name;
if (fileInfo.attrib & _A_SUBDIR)
{
if (strcmp(fileInfo.name, ".") != 0 && strcmp(fileInfo.name, "..") != 0)
{
FindFile(fileName, strPath + path + "\\");
}
}
else if (fileInfo.attrib & _A_ARCH && path.substr(path.find_last_of('.')) == exeName)
{
//cout<<strPath + fileInfo.name<<endl;
vct.push_back(strPath+fileInfo.name);
}
}while (_findnext(handle, &fileInfo) == 0);
_findclose(handle);
return vct;
}
#endif


//void GetAllFiles( string path, vector<string>& files)    
//vector<string> FindFile(string path, string files)
//获取特定格式的文件名  


#if 0
void GetAllFormatFiles( string folderPath, vector<string>& files,string fileName)    
{    


_finddata_t FileInfo;
string strfind = folderPath + "\\*" ;
long Handle = _findfirst(strfind.c_str(), &FileInfo);


if (Handle == -1L)
{
cerr << "can not match the folder path" << endl;
exit(-1);
}


do{
//判断是否有子目录
if (FileInfo.attrib & _A_SUBDIR)    
{


if( (strcmp(FileInfo.name,".") != 0 ) &&(strcmp(FileInfo.name,"..") != 0))   
{
string newPath = folderPath + "\\" + FileInfo.name;
GetAllFormatFiles(newPath,files,fileName );
}
}
else  
{
//fout << folderPath << "\\" << FileInfo.name  << " ";
files.push_back(folderPath + "\\" + FileInfo.name);
}
}while (_findnext(Handle, &FileInfo) == 0);




_findclose(Handle);   
   
}  


#endif


void GetAllFormatFiles( string path, vector<string>& files,string format)    
{    
//文件句柄    
long   hFile   =   0;    
//文件信息    
struct _finddata_t fileinfo;    
string p;    
if((hFile = _findfirst(p.assign(path).append("\\*" /*+ format*/).c_str(),&fileinfo)) !=  -1)    
{    
do    
{      
if((fileinfo.attrib &  _A_SUBDIR))    
{    
if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)    
{  
//files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
GetAllFormatFiles( p.assign(path).append("\\").append(fileinfo.name), files,format);   
}  
}    
else    
{    
string str1 = p.assign(path).append("\\").append(fileinfo.name);
string str2 = ".txt";
if (str1.find(str2) != -1)
{
files.push_back( p.assign(path).append("\\").append(fileinfo.name));
}
//files.push_back( p.assign(fileinfo.name));  //将文件路径保存,也可以只保存文件名:    p.assign(path).append("\\").append(fileinfo.name)  
}    
}while(_findnext(hFile, &fileinfo)  == 0);    


_findclose(hFile);   
}   





bool modeChoose(string str)
{
int iCtrl = 0;
if (str.substr(0,2)!="0x")
{
return false;
}
else
{
string strlend = "\t";


string strBtckUp = str;
unsigned int iPos = str.find(strlend);
while (iPos != string::npos)
{
str = str.substr(iPos+strlend.size());
iPos = str.find(strlend);
str = str.substr(0,iPos);
if (str.size()>=1)
{
for (int i = 0; i < strBtckUp.size(); i++)
{
if (strBtckUp[i]=='\t')
{
iCtrl ++ ;
}
}
if (iCtrl >= 3)
{
if (strBtckUp[strBtckUp.size()-1]=='\t')
{
return true;
}
return false;
}
else
{
return false;
}
}
else
{
return false;
}
}
return false;
}

}


int fnGetModSlc(string strFileName)
{
string strMode = "";
ifstream fin(strFileName.c_str());
if (fin.bad())
{
cout<<"Error !"<<endl;
system("pause");
exit(1);
}
getline(fin,strMode);

if (modeChoose(strMode)) //判断是否为模式二
{
return MyEnum::MUL_MODE;
}
else if (fnIsHeadLine(strMode))
{
return MyEnum::ONE_MODE;
}
else
{
return MyEnum::MIS_MODE; 
}




}


string getStrNewID(string strID)
{
string NewstrID ="";
string strlend = ",";
unsigned int iPos = strID.find(strlend);
if (strID!="")
{

while (iPos != string::npos)
{
NewstrID += "0x";
NewstrID += strID.substr(0,iPos);
strID = strID.substr(iPos+strlend.size());
iPos = strID.find(strlend);


NewstrID += ",";
}
NewstrID = NewstrID.substr(0,NewstrID.size()-1);


}
return NewstrID;
}


string getStrNewAdd(string strAdd)
{
string strNewAdd ="";
strNewAdd += "\t";
strNewAdd += "\"" + strAdd + "\"";
strNewAdd += ",";
return strNewAdd;
}


string getstrRend(string strNew)
{
string strlend("\t");
unsigned int iPos = strNew.find(strlend);
string strNewLeft="";
while (iPos !=string::npos)
{
strNewLeft += "\"";
strNewLeft += strNew.substr(0,iPos);
strNew = strNew.substr(iPos+strlend.size());
iPos = strNew.find(strlend);
strNewLeft += "\",";
}
strNewLeft = strNewLeft.substr(0,strNewLeft.size()-1);
return strNewLeft;


}


/****************模式二*****************/
string fnGetIdFromTwoStr(string str)
{
vector<string> vct;
vct.clear();


string strResult = "";
string strNew = str.substr(2); //切除0x
string strIdent = "\t";


unsigned int iPos = strNew.find(strIdent);
string strID = strNew.substr(0,iPos);//获取第一个Tab前的字符串
string strAdd = strID.substr(strNew.find_last_of(",")+1); //获取上个字符串最后一个逗号之后的数据


strNew = strNew.substr(iPos+strIdent.size()); //获取第一个Tab之后的数据
strNew =strNew.substr(0,strNew.size()-1);  //把最后一个Tab切掉


strID = getStrNewID(strID); //获取ID




strAdd = getStrNewAdd(strAdd); //获取ID之后的第一个数据





string strRend = getstrRend(strNew);
// iPos = strNew.find(strIdent);
// string strNewFron ="";
// string strFront = strNew.substr(0,iPos); //获取ID之后的第二个数据
// strNewFron += ",";
// strNewFron += "\"" + strFront + "\"";
// //vct.push_back(strNewFron);
// 
// string strNewReen = "";
// string strRend=  strNew.substr(iPos+strIdent.size()); //获取ID之后的第三个数据
// strNewReen += ",";
// strNewReen += "\"" + strRend + "\"";
// //vct.push_back(strNewReen);
string strNewLine = strID + strAdd +strRend;


return strNewLine;
}


void fnReadFileModeTwo(string strFilename)
{
vector<string> vct;
vct.clear();


ifstream fin(strFilename.c_str());
if (fin.bad())
{
cout<<"Error when open file!"<<endl;
system("psuse");
exit(1);
}
string str ="";
while (getline(fin,str))
{
if (str!="")
{
string strNewFile =fnGetIdFromTwoStr(str);


vct.push_back(strNewFile);

}
}
fin.close();




ofstream fout(strFilename.c_str());
if (fout.bad())
{
cout<<"Error when write file!"<<endl;
system("psuse");
exit(1);
}


vector<string>::iterator it;
for (it = vct.begin();it != vct.end(); it++)
{
fout<<*it<<endl;
}

fout.close();
//return vct;
}




void getFileName()
{
char buff[1000];
_getcwd(buff, 1000);


string fileName = ".txt";



vector<string>vct;
vct.clear();


GetAllFormatFiles(buff, vct,fileName);


vector<string>::iterator it;


int iCtrl = 1;


float iNumber = 0.0;
int iTote = vct.size();




for (it = vct.begin();it != vct.end();it++)
{
iNumber ++;
cout << "正在处理中,请稍等...已完成 " << setprecision(2) << fixed << (iNumber/iTote)*100 << "%" << endl;


string strFileName = *it;


string str_size = "";
ifstream fin_size(strFileName.c_str());
if (fin_size.bad())
{
return ;
}
if (getline(fin_size,str_size))
{
if (str_size!="")
{
string strEnd = ",";
unsigned int iPos = str_size.find(strEnd);
while (iPos!=string::npos)
{
str_size = str_size.substr(iPos+strEnd.size());
iPos = str_size.find(strEnd);
iCtrl++;
}
}
}
ID_SIZE = iCtrl;


int iMode = fnGetModSlc(strFileName);


/***数据存储***/
vector<MyDate> vctMyDatr;
vector<MyDateTwo> vctMyDateTwo;
vctMyDatr.clear();







switch (iMode)
{
case 1: /****模式一(5位ID)****/



/*****读取数据(包括整理数据)****/
fnReadFile(vctMyDatr,*it);


/***写入数据到文件中***/
fnWriteFile(vctMyDatr,*it);
break;


case 2: //模式二(5位ID,后面有Tab)
/*****读取数据(包括整理数据)****/
fnReadFileModeTwo(*it);


/***写入数据到文件中***/
//fnWriteFileModeTwo(vctMyDateTwo,*it);


break;
default:
ofstream fout("LoseFlie.txt",ios::app);


fout<<strFileName<<endl;
fout.close();
break;
}

}


}


void main(void)
{

getFileName();


}

猜你喜欢

转载自blog.csdn.net/liuyudong_/article/details/80366288
今日推荐