在Text文件中搜索字符串并在c#中返回一些字符串

时间:2015-12-23 06:32:05

标签: c# search stream file-read

如何解析文本行:

File.txt:

n:96 pts:341998 pts_time:3.79998 pos:-1 fmt:yuvj420p sar:12/11

,只需在pts_time之后显示时间值。

Expected Output :

3.79998

如何获得预期的输出? 任何帮助都会非常适合。

3 个答案:

答案 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,我不会在这里重复。