读书人

请帮小弟我看上怎样处理怎样的文本文件

发布时间: 2012-12-27 10:17:10 作者: rapoo

请帮我看下怎样处理怎样的文本文件快
Exec PRK_QZJ_Packet @TypeF='A4',@sLen=13,@dLen=13,@DataTime='2012-11-15 17:35:59',@TermAddress='8120D45D',@Data='688120D45D400868A400008E16'
我要大量处理的文本文件里面的内容里都是类似上面的语句,一个文本文件大概800K大小,我一开始是把多个文件里的全部语句一起读取进来放到CString里面在从前面开始一段一段处理,前面处理掉的内容就用right()处理掉,但是发现读取到CString里的内容越多,效率越低。。。。消耗的时间是不是都花在截取CString上了,不是的话是哪里,还有效率高得多的方法来处理吗,我的实在是太慢了、。。。。
贴点我的代码:

__declspec(dllexport) void ReadPAT()
{
CString FilePath,FileName,NewFileName,FileContent;int FileNum=0;
FileContent="";
CFileFind finder;
BOOL bWorking = finder.FindFile("D:\\文件共享\\PAT\\*.sql*");
while (bWorking&&FileNum<3)
{
bWorking = finder.FindNextFile();
FilePath = (LPCTSTR)finder.GetFilePath();
FileName = (LPCTSTR)finder.GetFileName();
CFile file(FilePath,CFile::modeRead);
CString NewFileContent;
char* pBuf;
DWORD dwFileLen;
dwFileLen=file.GetLength();
pBuf=new char[dwFileLen+1];
file.Read(pBuf,dwFileLen);
pBuf[dwFileLen]='\0';
NewFileContent=pBuf;
FileContent+=NewFileContent;
file.Close();
NewFileName = "D:\\文件共享\\data\\";
NewFileName+=FileName;
MoveFileEx(FilePath,NewFileName,MOVEFILE_REPLACE_EXISTING);
FileNum++;
}
int Length=FileContent.GetLength();
while(Length>0)
{
int index1=FileContent.Find("TypeF='");
CString str=FileContent.Mid(index1+7,2);
int Code;
str="0x"+str;
StrToIntEx(str,STIF_SUPPORT_HEX,&Code);
if(Code<=0x81||Code>0x8F)
{//不是需要的语句直接从CString里面截掉
int index2=FileContent.Find("@Data=");
int index3=FileContent.Find("16'",index2);
FileContent=FileContent.Right(Length-(index3+2));
Length=FileContent.GetLength();

}
else
{
int index4=FileContent.Find("@Data=");
int index5=FileContent.Find("16'",index4);
CString BaoWen=FileContent.Mid(index4+7,index5-index4-5);
char *pBuf = (LPSTR)(LPCTSTR)BaoWen;
int dwFileLen=BaoWen.GetLength();
BYTE tmp=0x00;
BYTE *cmd=new BYTE[dwFileLen];
memset(cmd,'\0',sizeof(cmd));
for(int i=0,j=0;i<dwFileLen/2,j<dwFileLen/2;i++,j++)
{
tmp=pBuf[j*2];
cmd[i]=ConvertHexChar(tmp)<<4;
tmp=pBuf[j*2+1];
cmd[i]+=ConvertHexChar(tmp);
}
//处理好的语句从CString里面截掉
FileContent=FileContent.Right(Length-(index5+2));
Length=FileContent.GetLength();

}
}
}

[最优解释]
每一次修改CString都涉及内存再分配,可以考虑ifstream,定义结构,并且重载operator>>(istream& is,...);每个结构都是单独的一句话,做成链表,然后对每句话进行裁剪.用CArchive也可以,也要重载>>.
[其他解释]
CStudioFile

读书人网 >VC/MFC

热点推荐