我有以下表格的数据,我想从中提取具体信息:
f
hj
13:45
A
Cd
F
RT
14:10
df
gj
G
.. goes on
我想说,我希望F
和gj
之间的所有内容都包含时间戳,我将如何进行此操作。我知道如何获得从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
答案 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;
}
}
}
}
}