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

时间:2018-02-20 06:12:06

标签: c# regex

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;
            }
        }
    }

这是我目前的代码。

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

  

"TEST-END : 2017-01-08 15:51 PROGRAM : TLE8888QK-B2 BAU-NR : 95187193"

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

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

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

4 个答案:

答案 0 :(得分:3)

您提取文本。它似乎很规则,所以正则表达式应该能够提供帮助:

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
    }
}

输出:

2017-01-08 15:51   // this is group 1, group 0 is the full capture including TEST-END : 

使用此功能在regexr中检查它:https://regexr.com/3l1sf如果您将鼠标悬停在文本上,它将覆盖您的捕获组

正则表达式意味着:

^                                    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

有关正则表达式的更多信息:

答案 1 :(得分:0)

您可以使用“:”拆分该行,就像这样

 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;
                }

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

答案 2 :(得分:0)

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

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;
    }
}

输出:2017-01-08 15:51

答案 3 :(得分:0)

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

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();

        }
    }
}