C# 如何从文本文件中读取特定行和文本
这是我目前的代码 我想从特定行(例如第8行)读取,该行以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,它可以是用户键入的不同数字。我已经创建了一个文本框
“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();
}
}
}