C# 从文本文件c中提取特定的文本行

C# 从文本文件c中提取特定的文本行,c#,C#,我正在使用StreamReader逐行读取文本文件,并将其显示到控制台。它读取并显示得很好。每行包含从左到右的日期、时间、编号和条目。文本文件有数百行文本。我想允许用户输入一个特定的日期和时间,并且只返回该时间范围内的文本行。因此,在数百行文本中,只能返回输入日期和时间的文本行 这是我到目前为止读取和显示文本文件的代码 public override void ReadFile(string strFileName) { try {

我正在使用StreamReader逐行读取文本文件,并将其显示到控制台。它读取并显示得很好。每行包含从左到右的日期、时间、编号和条目。文本文件有数百行文本。我想允许用户输入一个特定的日期和时间,并且只返回该时间范围内的文本行。因此,在数百行文本中,只能返回输入日期和时间的文本行

这是我到目前为止读取和显示文本文件的代码

    public override void ReadFile(string strFileName)
    {
        try
        {
            using (StreamReader sr = new StreamReader(@"C:\MyFolder\TextFile.txt"))
            {
                String line = sr.ReadLine();
                Console.WriteLine(line);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
这将在控制台上工作并显示文本,如下所示:

01-01-2015 10:10:10 Line of text blah blah blah
01-01-2015 10:10:10 Line of text blah blah blah
01-01-2015 10:10:10 Line of text blah blah blah
我现在正试图将这些行分开,以获得单独的部分,如日期和时间。这是我到目前为止所拥有的,但我不确定最好的方式是什么

        public override void ReadLiFile(string strFileName)
    {
        try
        {
            using (StreamReader sr = new StreamReader(@"C:\MyFolder\TextFile.txt"))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    string[] fields = line.Split("\t".ToCharArray()); 
                    int theInt = Convert.ToInt32(fields[0]);//to get first field e.g Date
                }
                Console.WriteLine(line);
            }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
我想根据给定的日期和时间缩小屏幕的输出范围。我不希望所有的行只显示与某个日期和时间相关的行,例如,在 01-01-2015 10:10:10和 01-01-2015 10:15:15

我猜我需要隔离每行中的日期和时间字段并存储值。我尝试拆分行并存储第一个值,即Date。我的问题是什么是分割行中字段的最佳方法?我的尝试无效。我现在得到一个错误,说“无法读取文件”和“输入字符串格式不正确”
感谢您的帮助。

这将提取日期部分并将其解析为日期时间,然后您可以根据该日期时间进行筛选

DateTime dt;
if (DateTime.TryParse(fields[0] + " " + fields[1], out dt))
    if (dt >= minDate && dt <= maxDate)
var startDate = new DateTime(2015, 1, 1, 10, 10, 10);
var endDate = new DateTime(2015, 1, 1, 10, 15, 15);

var result = (from line in File.ReadLines(@"C:\MyFolder\TextFile.txt")
              let pieces = line.Split('\t')
              let date = DateTime.ParseExact(pieces[0] + pieces[1], "MM-dd-yyyyHH:mm:ss", CultureInfo.InvariantCulture)
              where date >= startDate && date <= endDate
              select line).ToList();
我是林克,以防你以前没见过。一旦你习惯了它,它就非常适合查询

let关键字允许您存储数据,例如,您可以在整个查询过程中多次使用它,而无需执行ParseExact或多次拆分


从文件中读取尽可能少的行,仅足以满足您的查询。虽然在这种情况下,它必须解析每一行来检查日期,但它仍然在读取所有行。

这应该打印所有日期在startDate和endDate之间的行。 我省略了时间部分,但你应该知道怎么做

DateTime startDate = new DateTime(2015, 1, 1);
DateTime endDate = new DateTime(2015, 1, 3);
var query = File.ReadLines(@"e:\1.txt").Select(line => new { Line = line, Date = Convert.ToDateTime(line.Split(' ').First()) })
                                        .Where(x => x.Date >= startDate && x.Date <= endDate);

您正在使用StreamReader。为什么要使用ReadToEnd而不是ReadLine?可以在空格上拆分,然后使用前两部分获得日期时间,然后可以将其与用户输入进行比较。有很多方法可以做到这一点。我会像上面所说的那样逐行阅读,然后在每一行上我会构建一个正则表达式来匹配您试图提取的文本的特定部分,然后我会将这个匹配放在字符串列表中作为临时存储的方式。谢谢@Luaan。我将切换到ReadLine。我认为ReadToEnd可以使用。为什么会有“否决票”?这个问题有什么问题?考虑增加一些解释,说明你的实际问题太棘手了。博士为了这么小的回答。。。并查看只考虑代码的答案。使用let关键字+1。尽管这样使用大型LINQ语句有时会有点难看。