C# 如何从文本文件中读取特定行和文本

C# 如何从文本文件中读取特定行和文本,c#,regex,C#,Regex,这是我目前的代码 我想从特定行(例如第8行)读取,该行以“Test End”开头。但是,第8行包含所有这些内容 “测试结束:2017-01-08 15:51程序:TLE8888QK-B2 BAU-NR:95187193” 但是我只想读2017-01-98 15:51 我该如何更改代码才能得到它?目前,我得到的是整行,而不是我想要的特定时间戳 编辑 如何更改代码,使string lot=“”可以是任何数字,这意味着它不需要是RU644276G01,它可以是用户键入的不同数字。我已经创建了一个文本框

这是我目前的代码

我想从特定行(例如第8行)读取,该行以
“Test End”
开头。但是,第8行包含所有这些内容

“测试结束:2017-01-08 15:51程序:TLE8888QK-B2 BAU-NR:95187193”

但是我只想读2017-01-98 15:51

我该如何更改代码才能得到它?目前,我得到的是整行,而不是我想要的特定时间戳

编辑
如何更改代码,使
string lot=“”
可以是任何数字,这意味着它不需要是RU644276G01,它可以是用户键入的不同数字。我已经创建了一个文本框供用户输入号码

您可以使用“:”来拆分行,如下所示

string lot = "RU644276G01";

var year = "201" + lot.Substring(2, 1);
var folder = @"\\sinsdn38.ap.infineon.com\ArchView\03_Reports\" + year +
             @"\" + lot.Substring(3, 2) + @"\" + lot.Substring(0,8) + @"\";

DirectoryInfo di = new DirectoryInfo(folder);

foreach (var fi in di.GetFiles("*.TLT"))
{
    var file = fi.FullName;
    string line;
    using (StreamReader sr = new StreamReader(file))
    {
        while ((line = sr.ReadLine()) != null)
        {
            if (line.StartsWith("TEST-END"))
            {
                timeStampTextBox.Text = line;
            }
        }
    }
像这样约会

 var value = line.split(':');
上述声明意味着

 var date = value[1] + ":" + value[2].Replace("PROGRAM", "");

这不是最好的答案,这完全取决于你给出的陈述。

你提取文本。这似乎是一种非常规则的模式,因此正则表达式应该能够帮助:

date = "2017-01-98 15" + ":" + "51"

                if (line.StartsWith("TEST-END"))
                {
                    var value = line.split(':');
                    var date = value[1] + ":" + value[2].Replace("PROGRAM", "");
                    timeStampTextBox.Text = date;
                }
输出:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var line = "TEST-END : 2017-01-08 15:51 PROGRAM : TLE8888QK-B2 BAU-NR : 95187193";

        Regex re = new Regex(@"^(?:TEST-END : )(.*?\d{4}-\d{2}-\d{2} \d{2}:\d{2})");

        var match = re.Match(line);

        Console.WriteLine(match.Groups[1]);         

        Console.ReadLine(); // leave console open
    }
}
使用此选项在regexr中进行检查:如果您将鼠标悬停在文本上,它将显示您的捕获组

regex是指:

2017-01-08 15:51   // this is group 1, group 0 is the full capture including TEST-END : 
有关正则表达式的详细信息:

  • 正则表达式测试器(我使用的众多测试器之一):


    • 以下是我使用正则表达式的答案

      ^                                    start of the string
       (?:TEST-END : )                     non capturing group, text must be present
       (                                   a group
         .*?                               as few (0-n) anythings as possible
         \d{4}-\d{2}-\d{2} \d{2}:\d{2}     4 digits-2 digits-2digits 2digits:2digits
       )                                   end of group
      

      输出:2017-01-08 15:51

      我终于从最后一行中获得了所有三个参数

      if (line.StartsWith("TEST-END"))
      {
          Regex re = new Regex(@"\d{4}-\d{2}-\d{2} \d{2}:\d{2}");
          var match = re.Match(line);
      
          if(m.Success)
          {
              timeStampTextBox.Text = match.Value;
          }
      }
      
      使用系统;
      使用System.Collections.Generic;
      使用System.Linq;
      使用系统文本;
      使用System.Text.RegularExpressions;
      命名空间控制台应用程序1
      {
      班级计划
      {
      静态void Main(字符串[]参数)
      {
      Dictionary dict=新字典();
      字符串模式=@“(?'name'[^\s]+)\s:\s(?'value'[\w\s\-]*.\124;\ d{4}-\d{2}-\d{2}\s\d{2}:\d{2})”;
      string line=“测试结束:2017-01-08 15:51程序:TLE8888QK-B2 BAU-NR:95187193”;
      MatchCollection matches=Regex.matches(行、模式、RegexOptions.rightoleft);
      foreach(匹配中的匹配)
      {
      WriteLine(“名称:'{0}',值:'{1}',match.Groups[“name”].value,match.Groups[“value”].value);
      dict.Add(match.Groups[“name”].Value,match.Groups[“Value”].Value);
      }
      DateTime date=DateTime.Parse(dict[“TEST-END”]);
      Console.ReadLine();
      }
      }
      }
      
      如果你已经接到了电话,试着拨弄一下感谢你宝贵的回答!请问,我把代码放在哪里?在“如果”之后或在“如果”命令内部?将不起作用。如果在
      处拆分,
      值[2]
      将看起来像
      “51程序”
      我不建议在没有正则表达式的情况下执行此操作,它们是专门为此工作设计的。很好,但我想OP希望输出没有“测试结束”:@Neijwiert感谢您的捕获,修复了它并将其放在regexr中,以供使用,感谢您对正则表达式的宝贵见解!我还可以问一下,我把代码放在哪里?我是将代码放在“program.cs”中还是放在我输入所有代码的代码中?@Crystal我们假设您已经知道了一种获取所需行的方法,那么这应该放在用于获取该行的逻辑之后。@Crystal我可能会创建一个接收字符串(您的行)的方法然后吐出你想要的部分或者一个空字符串(如果不存在)。您还可以使用
      bool-TryParse(string-line,out-string-timeStamp)
      方法来模拟大多数基本类型(bool,int,…)上提供的
      TryParse(…)
      ,这样您就可以将其作为
      string-myDate放入代码中;if(TryParse(myLine,out myDate)){…使用myDate进行smth..}其他..
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Text.RegularExpressions;
      
      namespace ConsoleApplication1
      {
          class Program
          {
      
              static void Main(string[] args)
              {
                  Dictionary<string, string> dict = new Dictionary<string, string>();
      
                  string pattern = @"(?'name'[^\s]+)\s:\s(?'value'[\w\s\-]*|\d{4}-\d{2}-\d{2}\s\d{2}:\d{2})";
                  string line = "TEST-END : 2017-01-08 15:51 PROGRAM : TLE8888QK-B2 BAU-NR : 95187193";
      
                  MatchCollection matches = Regex.Matches(line, pattern, RegexOptions.RightToLeft);
      
                  foreach (Match match in matches)
                  {
                      Console.WriteLine("name : '{0}', value : '{1}'", match.Groups["name"].Value, match.Groups["value"].Value);
                      dict.Add(match.Groups["name"].Value, match.Groups["value"].Value);
                  }
      
                  DateTime date = DateTime.Parse(dict["TEST-END"]);
                  Console.ReadLine();
      
              }
          }
      }