如何提取包含标头的特定数据

时间:2015-08-17 18:03:58

标签: c# timestamp

我有以下表格的数据,我想从中提取具体信息:

    f
    hj
13:45
    A
    Cd
    F
    RT
14:10
    df
    gj
    G
.. goes on

我想说,我希望Fgj之间的所有内容都包含时间戳,我将如何进行此操作。我知道如何获得从F到gj的行,但我也不知道如何包含时间戳,我对c#很新。任何帮助将不胜感激。

输出应该类似于

13:45
    F
    RT
14:10
    df
    gj

编辑:::

public static void search_HstrLog()
        {
            int counter = 0;

            string[] hist_Logs = Directory.GetFiles(@"c:\logs");

            string line;

            for (int i = 0; i < hist_Logs.Count(); i++)
            {
                StreamReader reader = new StreamReader(hist_Logs[i]);

                bool betweenStartAndEnd = false;
                while ((line = reader.ReadLine()) != null)
                {
                    {
                        {

                        string start = "RUN";
                        string end = "STOP";


                            if(line.Contains(start))
                                betweenStartAndEnd = true;

                            if (betweenStartAndEnd || isTimeStamp(line))
                                Console.WriteLine(line);

                            if(line.Contains(end))
                                betweenStartAndEnd = false;
                        }
                    }
                }

                reader.Close();
            }
        }

    public static bool isTimeStamp(string line)
    {
        return Regex.IsMatch(line, @"^\d{2}:\d{2} ?[a-z]*$");
    }

这就是我现在所做的,正则表达式已经被轻易更新,因为时间戳行也可以包含文本,包括开始和结束术语,例如14:22 RUN

此外,这是数据外观的更具体的准确版本

14:22 RUN
     - abc
     - bfg
         dmf
            -rkc
15:33 
     dbv
        -fjh
        -fjs

所以在上面的情况中,如果start是RUN而end是fjh,那么结果就是......

 14:22 RUN
         - abc
         - bfg
             dmf
                -rkc
 15:33 
      dbv
         -fjh

如果start为bfg且end为dbv,则输出为 -

14:22 
    - bfg
         dmf
            -rkc
15:33 
     dbv

2 个答案:

答案 0 :(得分:0)

基本上,如果您处于起始值和结束值之间,则需要跟踪,然后需要一种方法来识别时间戳。这里我使用正则表达式,但您可以将其更改为其他任何内容,包括使用DateTime.ParseExact。如果您需要在比较之前删除前导和尾随空格,则可能还需要使用string.Trim

string start = "F";
string end = "gj";
bool betweenStartAndEnd = false;
foreach(var line in lines)
{
    if(line == start)
        betweenStartAndEnd = true;

    if(betweenStartAndEnd || isTimeStamp(line))
        Console.WriteLine(line);

    if(line == end)
        betweenStartAndEnd = false;
}

public static bool isTimeStamp(string line)
{
    return Regex.IsMatch(line, @"^\d{2}:\d{2}$");
}

答案 1 :(得分:0)

使用状态机,如下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        enum State
        {
            FIND_START,
            COLLECT_DATA,
            STOP_COLLECTING
        }
        static void Main(string[] args)
        {
            string input =
                    "14:22 RUN\n" +
                         "- abc\n" +
                         "- bfg\n" +
                             "dmf\n" +
                                "-rkc\n" +
                    "15:33\n" +
                         "dbv\n" +
                            "-fjh\n" +
                            "-fjs\n";

            StringReader reader = new StringReader(input);

            string inputLine = "";
            string output = "";
            State state = State.FIND_START;
            while ((inputLine = reader.ReadLine()) != null)
            {
                switch (state)
                {
                    case State.FIND_START:
                        if (inputLine.Contains("RUN"))
                        {
                            output += inputLine + "\n";
                            state = State.COLLECT_DATA;
                        }
                        break;
                    case State.COLLECT_DATA:
                        output += inputLine + "\n";
                        if (inputLine == "dbv") state = State.STOP_COLLECTING;
                        break;
                    case State.STOP_COLLECTING:
                        break;

                }
            }

        }
    }
}