我如何循环文本文件并找到日期和时间之间的空格?

时间:2014-12-20 02:06:28

标签: c# .net winforms

文本文件很长我内部有很多行,例如:

08/12/2014 00:59:41   Ok
08/12/2014 01:05:01   Ok
08/12/2014 01:10:01   Ok
08/12/2014 01:15:02   Ok
08/12/2014 01:20:01   Ok
08/12/2014 01:25:01   Ok
08/12/2014 01:30:01   Ok
08/12/2014 01:35:01   Ok
08/12/2014 01:40:01   Ok
08/12/2014 01:45:01   Ok
08/12/2014 01:50:01   Ok
08/12/2014 01:55:01   Ok
08/12/2014 02:00:01   Ok

除了每条写入行之间的第一行之外的空格大约是5分钟。 我需要做的是循环文本文件,找到两行之间有超过5分钟的地方。

例如,如果我找到一行08/12/2014 01:50:01 Ok并且正好在08/12/2014 02:55:01 Ok之后的行而不是08/12/2014 01:55:01 Ok,那么请在新文本文件中写入这两行。 因此,在新的文本文件中,我将看到例如:

08/12/2014 01:50:01   Ok
08/12/2014 02:55:01   Ok

所以我知道这里有问题。

我需要以某种方式循环文本文件并找到这个位置,每行之间的时间与其他行不同,将这两行写入新文本文件。 因此,如果在这个文本文件中我有10000行,则新文本文件应该有4-5行。

这就是我现在创建和更新文本文件的方式:

private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {

            if (e.Error != null)
            {
                timer1.Stop();
                span = new TimeSpan(0, (int)numericUpDown1.Value, 0);
                label21.Text = span.ToString(@"mm\:ss");
                timer3.Start();
            }
            else if (!e.Cancelled)
            {
                label19.ForeColor = Color.Green;
                label19.Text = "חיבור האינטרנט והאתר תקינים";
                label19.Visible = true;
                timer3.Stop();
                if (timer1.Enabled != true)
                {
                    if (BeginDownload == true)
                    {
                        timer1.Start();
                    }
                }                
                bool fileok = Bad_File_Testing(combinedTemp);
                bool compared;
                if (fileok == true)
                {

                    StreamWriter w = new StreamWriter(combinedarchivefileanddir,true);
                    {
                        w.WriteLine(DateTime.Now + "   Ok");
                        w.Close();
                    }
                    File1 = new Bitmap(combinedTemp);
                    try
                    {
                        compared = ComparingImages(File1);
                    }
                    catch (WebException ex)
                    {
                        MessageBox.Show("Error: " + ex.Message + "\n\nCause: " + "Image not yet loaded.");
                        return;
                    }
                }
                else
                {
                    File.Delete(combinedTemp);
                }
                if (File1 != null)
                {
                    File1.Dispose();
                }
            }
        }

在这个完成的事件中,我添加了部分:

StreamWriter w = new StreamWriter(combinedarchivefileanddir,true);
                    {
                        w.WriteLine(DateTime.Now + "   Ok");
                        w.Close();
                    }

我刚才添加了一个循环代码,逐行循环遍历文本文件:

private void ReadTextFile()
        {
            try
            {
                int counter = 0;
                string line;
                StreamReader file =
                   new StreamReader(combinedarchivefileanddir);
                while ((line = file.ReadLine()) != null)
                {
                    //string t = line;
                    counter++;
                }

                file.Close();
            }
            catch
            {

            }
        }

我现在如何计算每两行之间的计算,并将时间和日期空间与其他行不同的行写入新文本文件?

4 个答案:

答案 0 :(得分:2)

您可以检查由TotalMinutes个对象的差异创建的TimeSpan的{​​{1}}(使用DateTime方法)。

类似的东西:

.Subtract

答案 1 :(得分:1)

我认为您的第一个文件位于string

    static void Main(string[] args)
    {
        string textFile = @"08/12/2014 00:59:41   Ok
08/12/2014 01:05:01   Ok
08/12/2014 01:10:01   Ok
08/12/2014 01:15:02   Ok
08/12/2014 01:20:01   Ok
08/12/2014 01:25:01   Ok
08/12/2014 01:30:01   Ok
08/12/2014 01:35:01   Ok
08/12/2014 01:40:01   Ok
08/12/2014 01:45:01   Ok
08/12/2014 01:50:01   Ok
08/12/2014 01:55:01   Ok
08/12/2014 02:00:01   Ok";

        textFile = textFile.Replace("\r", "");
        textFile = textFile.Replace("Ok", "");

        string[] lines = textFile.Split('\n');

        int loopRange = 0;
        if(lines.Length % 2 !=0)
        {
            loopRange = lines.Length - 1;
        }
        else
        {
            loopRange = lines.Length;
        }


        List<DateTime> newList = new List<DateTime>();
        for (int i = 0; i < loopRange; i += 2)
        {
            DateTime date1 = Convert.ToDateTime(lines[i]);
            DateTime date2 = Convert.ToDateTime(lines[i+1]);

            if(Math.Abs((date1 - date2).TotalMinutes) >= 5)
            {
                newList.Add(date1);
                newList.Add(date2);
            }
        }

        TextWriter tw = new StreamWriter(@"C:\test1.txt");

        foreach (DateTime s in newList)
            tw.WriteLine(s);

        tw.Close();
    }

首先,您要从字符串中删除\r,之后是OK。你希望在你的日期的两个日期,这意味着如果日期的数量不均匀,你应该删除一个!之后循环由两个元素组成,并取两个值之间的math.Abs​​值差异。

PS因为我不能很好地理解你的问题,如果你想每个日期逐个分组,你需要删除loopRange变量并减少列表长度,并按照以下方式执行:< / p>

    static void Main(string[] args)
    {
        string textFile = @"08/12/2014 00:59:41   Ok
08/12/2014 01:05:01   Ok
08/12/2014 01:10:01   Ok
08/12/2014 01:15:02   Ok
08/12/2014 01:20:01   Ok
08/12/2014 01:25:01   Ok
08/12/2014 01:30:01   Ok
08/12/2014 01:35:01   Ok
08/12/2014 01:40:01   Ok
08/12/2014 01:45:01   Ok
08/12/2014 01:50:01   Ok
08/12/2014 01:55:01   Ok
08/12/2014 02:00:01   Ok";

        textFile = textFile.Replace("\r", "");
        textFile = textFile.Replace("Ok", "");

        string[] lines = textFile.Split('\n');


        List<DateTime> newList = new List<DateTime>();
        for (int i = 0; i < lines.Length; i ++)
        {
            if(i == lines.Length - 1)
               break;

            DateTime date1 = Convert.ToDateTime(lines[i]);
            DateTime date2 = Convert.ToDateTime(lines[i+1]);

            if(Math.Abs((date1 - date2).TotalMinutes) >= 5)
            {
                //I suppose that the second value is always bigger than the first
                newList.Add(date2);
            }
        }

        TextWriter tw = new StreamWriter(@"C:\test1.txt");

        foreach (DateTime s in newList)
            tw.WriteLine(s);

        tw.Close();
    }

答案 2 :(得分:1)

使用LINQ的简短解决方案:

var lines = File.ReadAllLines("input.txt");

Func<string, DateTime> getDate = s => DateTime.Parse(s.Substring(0, 19));

var errors = lines.Skip(1)
                .Zip(lines, (current, prev) => new {current, prev})
                .Where(i => (getDate(i.current) - getDate(i.prev)) > TimeSpan.FromMinutes(5))
                .Select(i => new[] {i.prev, i.current, ""});

File.WriteAllLines("output.txt", errors.SelectMany(error => error));

答案 3 :(得分:0)

虽然我写这篇文章没有其他人回答,但现在有几个好的答案给你们+1。但是自从我写这篇文章以来就是我的,我也可以发布它。

            int counter = 0;
            string line;

            // Read the file and display it line by line.
            System.IO.StreamReader file =
               new System.IO.StreamReader("c:\\Intel\\times.txt");
            DateTime lineTime;
            DateTime lastTime = DateTime.MinValue;


            while ((line = file.ReadLine()) != null)
            {
                line = line.Substring(0, line.IndexOf(" ", 12));
                DateTime.TryParse(line, out lineTime);
                if (lastTime == DateTime.MinValue)
                {
                    counter++;
                    lastTime = lineTime;
                }
                else
                {
                    var mins = lineTime.Subtract(lastTime).Minutes;
                    if (mins > 5)
                    {
                        Console.WriteLine(line);
                    }
                    counter++;
                    lastTime = lineTime;
                }
            }

            file.Close();

            // Suspend the screen.
            Console.ReadLine();