文本文件很长我内部有很多行,例如:
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
{
}
}
我现在如何计算每两行之间的计算,并将时间和日期空间与其他行不同的行写入新文本文件?
答案 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();