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

时间:2015-04-23 15:27:31

标签: c#

我正在使用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。 我的问题是分割线中字段的最佳方式是什么?我的尝试无效。我现在收到一条错误消息,指出无法读取'文件'并且输入字符串格式不正确' 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

这将提取日期部分并将其解析为DateTime,然后您可以过滤它。

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

这是LINQ,以防您以前没见过。一旦你习惯它,它就很适合查询。

let关键字允许您存储数据,以便(例如)您可以在整个查询中多次使用它,而无需多次执行ParseExactSplit

File.ReadLines从文件中读取尽可能少的行,足以满足您的查询。虽然在这种情况下,它必须解析每一行以检查日期,但无论如何它都会读取它们。

答案 1 :(得分:0)

DateTime dt;
if (DateTime.TryParse(fields[0] + " " + fields[1], out dt))
    if (dt >= minDate && dt <= maxDate)

答案 2 :(得分:0)

这应该会在startDateendDate之间打印 Dates 的所有行。 我省略了时间部分,但你应该知道如何去做。

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