一个拆解/读取字符串的问题,挺复杂的,请高手帮忙看看 在线等待...

LouisZX 2005-06-01 09:38:20
25-May-2005 09:31:36.58 ims-ms D 18 bat_squall@yahoo.com.cn rfc822;liucheng@neusoft.com liucheng@ims-ms-daemon mailsrv
25-May-2005 09:31:36.67 tcp_local J 0 gzhuawoo@direct168.com rfc822; wuzw@neusoft.com direct168.com (mail-gw1.neusoft.com [210.83.210.137]) 550 5.1.1 unknown or illegal alias: wuzw@neusoft.com
25-May-2005 09:31:37.02 tcp_intranet ims-ms E 150 zhaoxg@taxrefund.com.cn rfc822;z_w@neusoft.com z_w@ims-ms-daemon mailsrv mail (mail.neusoft.com [202.107.117.28])

这是我要分析的log.txt文件中的三条记录,每个字段是以空格分割的,但有的字段是空格,有的连续几个字段客户还需要放到一个变量里面.比如 我现在已经把25-May-2005 09:31:36.58 ims-ms D 18 bat_squall@yahoo.com.cn rfc822;liucheng@neusoft.com liucheng@ims-ms-daemon mailsrv 这条记录读到一个字符串里面了,现在以空格为分隔符,25-May-2005 放到数组p[0]里面,09:31:36.58 放到p[1]里面,ims-ms放到p[2]里面,ims-ms后面有一个空格是分割用的,再空面是8个空格,也要放到数组里面比如放到p[3]里面,最终目的是要把这些值插到数据库里面,数据库的某一个字段可以是空值,但关键的是p[3]这个字段有时候还有值,比如第三条记录的ims-ms就是应该存到p[3]的值,所以在分析日志文件,拆解串的时候遇到这样的情况怎么办?还有一个关键的问题是,虽然字段以空格分割,但是以第一条记录为例18后面的所有字段客户都需要放到p[4]里面,这个规律是固定的.基本就是这样的拆解规则,不知道我说清楚没有,请各位帮忙看看有没有什么办法,如果有没明白的地方可以跟贴问,我在线等待...
...全文
108 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
newcore 2005-06-01
  • 打赏
  • 举报
回复
辛苦,辛苦,楼主给分吧...
newcore 2005-06-01
  • 打赏
  • 举报
回复
写了个更通用的:要求:
1 不用固定格式
2 不同字符串以单空格分割
3 多个空格看做一个单独的字符串,纪录下空格个数

测试如下,应该是楼主的意思:

#define TOKEN 7

CString strToken[TOKEN] = {""};
CString strText = "25-May-2005 09:31:36.58 ims-msD 18 bat_squall@yahoo.com.cn rfc822;liucheng@neusoft.com";
char cDelime = ' ';
int nCurPos = 0, nNextPos=0, nLength = 0;
int nPart = 0;
while(nCurPos<=strText.GetLength ())
{
nNextPos = strText.Find (cDelime, nCurPos);
if(nNextPos<0&&nPart==TOKEN-1)
nNextPos = strText.GetLength ();
// 读取非空字符串
nLength = nNextPos - nCurPos;
memcpy(
strToken[nPart++].GetBuffer(nLength) ,
strText.GetBuffer(strText.GetLength ())+nCurPos ,
nLength );
if(nNextPos<strText.GetLength () && strText[nNextPos+1]==cDelime) // 下一个字符也是' '
{
// 循环读取空字符串,nLength++
while(strText[++nNextPos]==cDelime)
{
nLength++;
}
itoa(nLength-nCurPos+1, strToken[nPart++].GetBuffer(sizeof(int)), 10);
}
nCurPos = nCurPos + nLength+1;
nLength = 0;
}
for(int i=0; i<TOKEN; i++)
printf("%s\n" , (LPCTSTR)strToken[i]);
xtjqu 2005-06-01
  • 打赏
  • 举报
回复
是不是格式是定长的? 那你就直接几刀切下去不就得了
柯本 2005-06-01
  • 打赏
  • 举报
回复
我看了一下,你的位置基本是固定的,这样应该可以:
#include <afxwin.h>
#include <iostream>
using namespace std;
void main()
{
CString oldstr="25-May-2005 09:31:36.58 ims-ms D 18 bat_squall@yahoo.com.cn rfc822;liucheng@neusoft.com liucheng@ims-ms-daemon mailsrv ";
CString p[5];
int i,pos;

p[0]=oldstr.Mid(0,10);
p[1]=oldstr.Mid(12,11);
p[2]=oldstr.Mid(24,12);
p[2].TrimRight();
p[3]=oldstr.Mid(37,12);
p[3].TrimRight();
pos=oldstr.Find(' ',52);
p[4]=oldstr.Mid(pos+1);
p[4].TrimRight();
for(i=0;i<5;i++)
cout << "p["<<i<<"]="<<(LPCTSTR )p[i] << endl;

oldstr="25-May-2005 09:31:37.02 tcp_intranet ims-ms E 150 zhaoxg@taxrefund.com.cn rfc822;z_w@neusoft.com z_w@ims-ms-daemon mailsrv mail (mail.neusoft.com [202.107.117.28]) ";
p[0]=oldstr.Mid(0,10);
p[1]=oldstr.Mid(12,11);
p[2]=oldstr.Mid(24,12);
p[2].TrimRight();
p[3]=oldstr.Mid(37,12);
p[3].TrimRight();
pos=oldstr.Find(' ',52);
p[4]=oldstr.Mid(pos+1);
p[4].TrimRight();
for(i=0;i<5;i++)
cout << "p["<<i<<"]="<<(LPCTSTR )p[i] << endl;
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧