如何解析文本行:
File.txt:
n:96 pts:341998 pts_time:3.79998 pos:-1 fmt:yuvj420p sar:12/11
,只需在pts_time
之后显示时间值。
Expected Output :
3.79998
如何获得预期的输出? 任何帮助都会非常适合。
答案 0 :(得分:1)
用空格分割n:96 pts:341998 pts_time:3.79998 pos:-1 fmt:yuvj420p sar:12/11
。
string[] lineParts = line.Split(" ".ToCharArray());
获取与pts_time
键匹配的数组元素。
string ptsTime = lineParts.First(p => p.StartsWith("pts_time")); // pts_time:3.79998
将ptsTime
与:
string ptsTimeValue = ptsTime.Split(':')[1]; // 3.79998
答案 1 :(得分:1)
在private string GetTimeFromFile(string fileName, int searchIndex) {
//string found = string.Empty;
string line;
using (StreamReader file = new StreamReader(fileName)) {
while ((line = file.ReadLine()) != null) {
if (line.Contains(string.Format("n:" + searchIndex))) {
line = line.Substring(line.IndexOf("pts_time:")).Split(':')[1];
break;
}
}
}
return line;
}
之前添加:
{{1}}
像这样:
{{1}}
答案 2 :(得分:1)
使用正则表达式可以非常轻松地处理这些内容,以获取所需的信息。您可以构建一个模式以匹配您正在寻找的行,并提取这样的特定信息:
string pattern = string.Format("^n:{0}\s.+\spts_time:([\d.]+)\s", searchIndex);
^n:{0}\s
部分会肯定地识别您之后的行,您可以从捕获([\d.]+)
中提取相关的数据。
以这种方式使用:
private string GetTimeFromFile(string fileName, int searchIndex)
{
string pattern = string.Format("^n:{0}\s.+\spts_time:([\d.]+)\s", searchIndex);
Regex re = new Regex(pattern);
using (var file = File.OpenText(fileName))
{
string line;
while ((line = file.ReadLine()) != null)
{
var m = re.Match(line);
if (m.Success)
return m.Groups[1];
}
}
return null;
}
另一个可能在以后帮助你的正则表达式就是这个:
(?:(?<n>\w+):(?<v>\S+))
这将匹配行中的所有名称/值对,给出多个匹配结果。使用一点LINQ,您可以轻松地将结果转换为有用的集合,如下所示:
var re = new Regex(@"(?:(?<n>\w+):(?<v>\S+))");
var lineData =
// Get all matching terms in the source line
re.Matches(line)
// Convert to an enumerable we can use Select on
.OfType<Match>()
// Get the key/value out as a KeyValuePair
.Select(r => new KeyValuePair<string, string>(r.Groups["n"].Value, r.Groups["v"].Value))
// convert results to a Dictionary<string, string>
.ToDictionary(kv => kv.Key, kv => kv.Value);
我选择Dictionary<string, string>
作为输出,但您可以使用您喜欢的任何集合类型。分离出值后,您可以将它们提供给工厂方法,以创建表示行数据的类的实例,然后对实体类执行所有操作。
无论哪种方式,如果你使用它,那么请确保你理解正则表达式正在做什么以及为什么。当它们出错时,它们可能很难调试。关于这一点old joke,我不会在这里重复。