【发布时间】:2015-08-17 18:03:57
【问题描述】:
我有以下形式的数据,我想从中提取特定信息:
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
【问题讨论】:
-
这个不清楚。如果您知道获取线路很热门,那么为什么不包括时间戳?您是在问如何将值解析为
DateTime?您能否展示您迄今为止所做的任何尝试,并具体告诉我们为什么它不起作用? -
我实际上搜索了 F,一旦找到,就写下每一行,直到找到 gj,但是我不知道如何获得我错过的第一个时间戳。我如何返回并检索它?
-
解析文本(文件)总是有点乏味,正如人们所希望的那样。通常它需要或多或少的原始解析器实现。
-
您可能需要的语法可能如下所示:
DataBlock ::= <Time> | <Time><TextBlock>. TextBlock ::= <Text> | <Text><TextBlock>.如果您以这种方式解析,您总是有时间作为 DataBlock 的一部分,并且在完全解析 DataBlock 之后,您会查找您的 Text" F",然后更改状态并继续解析,直到找到一个带有 Text "gj" 的 DataBlock。