MEASUREMENTID=2501
;HIERARCHYID=218
;LOCATIONID=577
DATE=06/03/2006 14:26:22
[4]=Time:2048,0.001953,0.001953,0,0,0,0,0.000000,0,0,0
;AMPLITUDE=0.905308,0.935634,0.962393,0.992720,1.014127,1.044455,1.056942,
。。
。。*
AMPLITUDE=文本格式如上,我想要读取MEASUREMENTID=、HIERARCHYID=、LOCATIONID=、DATE=、AMPLITUDE=后的文本,并且要判断第5行关键字是Time,因为还有很多不是time的数据在同一个文件里我的思路是逐行读取,然后split("="),判断string[0]是否是上述的几个字符串,然后取值,但是AMPLITUDE后面还有多行数据也要读到,即读到*处,但实现还有些问题,问问大家有什么好的方法

解决方案 »

  1.   

    先把全文读进去,然后用split(";")再做处理
      

  2.   

    string content = "";
    while(true)
    {
        string s = ReadLine();
        int index = s.IndexOf('*');
        if(-1 == index)
        {
            content += s;
        }
        else
        {
            content += s.SubString(0, index);
            break;
        }
    }
      

  3.   

    split(";")是有问题的
    ;LOCATIONID=577
    DATE=06/03/2006 14:26:22
    中间就没有分号可以split
      

  4.   

    使用IndexOf("MEASUREMENTID=")/IndexOf("HIERARCHYID=")是最简便的方法。简单的字符串处理,不需要复杂化。
      

  5.   

    如果等号肯定是分割标志,后续字符串数据里不可能出现的话,split("=")比较好。这样 str(0),str(2) ... 就是标题, str(1), str(3) 什么的就是数据。
      

  6.   

    读取时一下子都读到一个string 中 即可
      

  7.   

    完整的文本:
    MEASUREMENTID=2499
    ;HIERARCHYID=218
    ;LOCATIONID=577
    DATE=06/03/2006 14:26:06
    [4]=Mag:0.739624MEASUREMENTID=2501
    ;HIERARCHYID=218
    ;LOCATIONID=577
    DATE=06/03/2006 14:26:22
    [4]=Time:2048,0.001953,0.001953,0,0,0,0,0.000000,0,0,0
    ;AMPLITUDE=0.905308,0.935634,0.962393,0.992720,1.014127,1.044455,1.056942,0.905308,0.935634,0.962393,0.992720,1.014127,1.044455,
    0.905308,0.935634,0.962393,0.992720,1.014127,1.044455,
    0.905308,0.935634,0.962393,0.992720,1.014127,1.044455,
    AMPLITUDE=



    。谢谢各位楼上,完整的如上,我需要滤掉前面5行的,只当有Time关键字的时候才取相应的文本,同时AMPLITUDE值要取两个AMPLITUDE之间的一长串值,有2048个点值
    而且文本里面包含这样子的很多,分别取出来
      

  8.   

    我原先也想=是分割符,但是还要判断第四行是Time关键字
      

  9.   

    那可以先全部读出到strAllTxt, 然后  int iPos = strAllTxt.IndexOf("[4]=Time"), 得到需要开始那段的第四行的起始位置。自己再做些判断和操作,应该就可以了吧。
      

  10.   

    do
    {
      int iIndex=strText.IndexOf("[4]=");  if(iIndex!=-1)  
      {
        //找到[4]开头的,检查下一个关键字是否为Time
        if(strText.SubString(iIndex+4,4).ToUpper()="Time".ToUpper())
        {
          //Do your things
        }
        else
          continue;
      }
      else   
        break;  //找不到,退出
    }
    while (strText.IndexOf("[4]=Time")!=-1)
      

  11.   

    或者先全部读出, 然后 split("MEASUREMENTID=")得到每一段的文本,再在每一段中判断是否有"[4]=Time", 如果有,再把这一段开头先补上"MEASUREMENTID=",然后再split("=")。
      

  12.   

    Sorry.上面处理应加上字符截取
      

  13.   

    那再问下怎样判断string1在string2中呢?
    我想逐行读,再判断time在那一行中,如果在再取下面的,最后保存到一个链表中
      

  14.   

    其实这个配置文件用xml来写。问题很容易解决如果这个文件是.ini文件的话也比较好读。去网上搜索一下C#读取ini文件的方法
      

  15.   

    逐行读取判断好了
    string measureid=null;
    string hierarchyid=null;
    string locationid=null;
        string date=null;
        string timeAmplitude=null;
    bool flag=false; while(sr.Peek()!=-1)
    {
    //nn.Add(sr.ReadLine());
    tmp=sr.ReadLine().Trim();//第1行

    string[] desc=tmp.Split(Convert.ToChar("="));
    if(desc[0].Equals("MEASUREMENTID"))
    {
    measureid=desc[1];

    tmp=sr.ReadLine().Trim();//第2行
    desc=tmp.Split(Convert.ToChar("="));

    if(desc[0].Equals(";HIERARCHYID"))
    {
    hierarchyid = desc[1]; tmp=sr.ReadLine().Trim();//第3行
    desc=tmp.Split(Convert.ToChar("=")); if(desc[0].Equals(";LOCATIONID"))
    {
    locationid = desc[1]; tmp=sr.ReadLine().Trim();//第4行
    desc=tmp.Split(Convert.ToChar("=")); if(desc[0].Equals("DATE"))
    {
    date = desc[1]; tmp=sr.ReadLine().Trim();//第5行
    desc=tmp.Split(Convert.ToChar("=")); if(desc[0].Equals("time"))
    { }
    }
    } }
                        
    }
      

  16.   

    好像可以了,原来自己老是想用单层循环来做,还是老老实实一行一行读再判断吧其中加了句判断time的语句
    tmp=sr.ReadLine().Trim();//第5行
    System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(tmp, "Time");
    if(mc.Count!=0){//如果存在Time字符 tmp=sr.ReadLine().Trim();//第6行 desc=tmp.Split(Convert.ToChar("="));
             timeAmplitude=desc[1];
    }
    else
    continue;
    不知道还有没有简易的方法,比如正则表达什么的,用indexof函数得到特定字符的位置再取之后的几位这种方法我也试过,但是=后面的字符试不定长的,怎么能够确定取之后几位呢?倒是每行尾有个回车符,那就要判断取得=与回车符之间的字符,估计还是很困难,一楼朋友说的字典匹配不知道什么意思,如何使用呢?二楼为什么还要方到表里呢?谢谢大家了,贴子再挂一天,明天散分呵
      

  17.   

    一行行判断,原来单层循环是想用stack结构来做,依次判断是否压入MEASUREMENTID、;HIERARCHYID、;LOCATIONID、DATE、,然后判断第5个参数是否为Time,如果不是全部将stack清空,重新循环,不知道行不行,stack数据结构不知如何实现,似乎也可以按类的方式来做
      

  18.   

    简单用SPLIT当然不行。
    其实万变不离其宗,只要根据等号,取出等号左右两部分。
    左边永远是一个对象,好说。
    右边根据格式一共有几种类型,进行判断,毕竟是可以找出每种格式特征的,针对其特征进行正确解析就行了。
      

  19.   

    1. read all secion (between MEASUREMENTID=) into string array, ignore the lines that begin with ";" (it is comment, isn't it?)2. parsing those strings for "Time:", if not find, abandon this secion and read next section.3. parsing AMPLITUDE= and others.
      

  20.   

    你全取来按\r或者\n split也可以的
    然后把分号replace掉,再判断好了
      

  21.   

    string sLine = null;
    StreamReader reader = new StreamReader("../../.txt",System.Text.Encoding.Default);
    while((sLine=reader.ReadLine())!=null)
    {
    string[] lineclass = sLine.Split('=')
    string sLeft = lineclass[0].Trim();  //等号左边的值;
    if(sLeft.Substring(0,4)=="Time")
    {
    //把值截出来不就是拉
    }
    string sRight = lineclass[1]; //等号右边的值;
    }
      

  22.   

    对话,读出来用SPLIT或者用正则表达式呀。