比较Excel表格和文本文件

我从Excel表中获得以下数据:

06:07:00 6:07 Data1 Data2 Data3 Data4 06:15:00 06:15 Data5 Data6 Data7 Data8 

我想将它与文本文件中的以下数据进行比较:

 XXXXXXXXXX 06:08:32 13.0 Data1 XXXXXXXXXX 06:08:45 6.0 Data2 xxxxxxxxxx 06:08:51 5.0 Data3 xxxxxxxxxx 06:08:56 13.0 Data4 xxxxxxxxxx 06:13:44 9.0 Data5 xxxxxxxxxx 06:13:53 11.0 Data6 xxxxxxxxxx 06:14:04 6.0 Data7 xxxxxxxxxx 06:14:10 13.0 Data8 

因为我想用这个时间比较两个文件(excel和文本),所以每个组的时间都不一样。 组1(数据1到数据4),组2(数据5到数据8)。

有没有人有任何想法如何去处理这种情况。

EDIT1:

这是我试图做的:

 private void doTest(string time) { TimeSpan ts = TimeSpan.Parse(time); int hours = ts.Hours; int min = ts.Minutes; int sec = ts.Seconds; int minstart, minend; string str; minstart = min - 5; minend = min + 5; while (min != minend) { sec = sec + 1; if (sec < 60) { if (hours < 10) str = hours.ToString().PadLeft(2, '0'); else str = hours.ToString(); if (minstart < 10) str = str + minstart.ToString().PadLeft(2, '0'); else str = str + minstart.ToString(); if (sec < 10) str = str + sec.ToString().PadLeft(2, '0'); else str = str + sec.ToString(); chkwithtext(str); } else if (sec == 60) { sec = 00; min = min + 1; str = hours.ToString() + min.ToString() + sec.ToString(); chkwithtext(str); } } } private void chkwithtext(string str) { // check with the text file here if time doesn't match go // back increment the time with 1sec and then check here again } 

这并不完全清楚你如何“比较”时间,但是对于这个答案,我将假定来自文本文件的数据要被比较,并且只有当它的时间戳在x分钟内(默认为x = 5)Excel时间戳。

我的build议是使用名为Schematiq的Excel加载项,你可以从http://schematiq.htilabs.com/下载(大约9MB)(见下面的截图)&#x3002; 这是免费的个人,非商业用途。 (免责声明:我为Schematiq的作者HTI Labs工作。)

但是,我会在Excel中处理时间。 首先,我们将计算Excel时间戳的开始/停止限制。 例如,第一次(06:07:00),我们想要6:02-6:12的范围。 我们还会将实际的“开始”和“结束”时间分成几小时,几分钟和几秒钟,以便稍后进行简化。 Excel数据表如下所示:

在这里输入图像说明

接下来,我们需要一个Schematiq“模板函数”,它将采取开始和结束时间,并返回一系列时间。 这个模板显示在这里:

在这里输入图像说明

该函数的input值实际上是“虚拟”值 – 该函数由Schematiq内部编译,然后可以在需要任何input的情况下调用。 “结果”单元格包含以'〜#…'开头的文本(以及几个前面的单元格) – 这表示包含表格,函数或其他结构的Schematiq数据链接 。 要查看它,您可以单击该单元格,然后查看在Excel中显示为任务窗格的Schematiq查看器 ,如下所示:

在这里输入图像说明

换句话说,Schematiq允许您在一个单元中保存一整个数据表

现在所有东西都已经build立起来了,我们只需导入文本文件,然后让Schematiq为我们完成工作。 对于Excel数据中的每个“时间组”,生成一个合适的时间范围,并将其与文本文件进行匹配。 您将返回所有匹配的数据,以及来自Excel和文本文件的任何不匹配的数据。 这里显示了必要的计算:

在这里输入图像说明

因此,您的Excel工作表很小,单击最后一个单元格将在Schematiq查看器中显示最终结果。 结果,包括Excel数据和“模板计算”,如下所示:

在这里输入图像说明

要清楚的是,你在这个屏幕截图中看到的是工作簿的全部内容 – 除了你看到的实际单元之外,没有其他的计算发生。

“最终结果”本身放大显示在这里:

在这里输入图像描述

这正是你之后的比较(在故意引入的错误 – Data9 – 在文本文件中,以演示匹配)。 然后你可以进行任何比较或进一步的分析。

所有的数据链接代表Schematiq函数的使用 – 语法与Excel非常相似,因此很容易获取。 例如,最后一个单元格中的呼叫是:

 =tbl.SelectColumns(D21, {"Data","Text file"}, TRUE) 

这将从“Data”和“Text file”列中select单元格D21中Schematiq表的所有列(此函数的最后一个布尔参数指示'all but')。

我build议下载Schematiq并自己尝试一下 – 我很乐意通过电子邮件向您发送我放在一起的工作簿的副本,所以应该立即运行。

我不知道,如果我明白你的意思,但我会开始导出excel文件到csv ; 分离器 – 以这种方式工作要容易得多。 然后是一些简单的容器类:

 public class DataTimeContainer { public string Data; public string TimeValue1 = string.Empty; public string TimeValue2 = string.Empty; } 

并以这种方式使用它:

 //Processint first file List<DataTimeContainer> Container1 = new List<DataTimeContainer>(); string[] lines = File.ReadAllLines("c:\\data1.csv"); string groupTimeValue1 = string.Empty; string groupTimeValue2 = string.Empty; foreach (string[] fields in lines.Select(l => l.Split(';'))) { //iterating over every line, splited by ';' delimiter if (!string.IsNullOrWhiteSpace(fields[0])) { //we're in a line having both values, like: //06:07:00 ; 6:07 groupTimeValue1 = fields[0]; groupTimeValue2 = fields[1]; } else //we're in line looking like this: // ; DataX Container1.Add(new DataTimeContainer(){Data = fields[1], TimeValue1 = groupTimeValue1, TimeValue2 = groupTimeValue2}); } //Processing second file List<DataTimeContainer> Container2 = new List<DataTimeContainer>(); lines = File.ReadAllLines("c:\\data2.txt"); foreach (string[] fields in lines.Select(l => l.Split(';'))) { Container2.Add(new DataTimeContainer() { TimeValue1 = fields[1], TimeValue2 = fields[2], Data = fields[3]}); } DoSomeComparison(); 

当然,我使用string作为数据types,因为我不知道他们应该是什么样的对象。 让我知道这是如何为你工作。

如果这是一次性的比较,我会build议只是将文本文件拖入Excel(如果需要,使用文本到列工具),并与内置函数进行比较。

但是如果你需要经常这样做,像Tarec这样的build议将是一个好的开始。 看起来你正在试图比较给定时间范围(?)内的单独事件日志 – 如果使用DateTime属性parsing对象而不是比较文本string,那么您的生活将会变得更加简单。

将你的2个数据源(excel和文本文件)的数据填充到2个列表中。
确保列表是相同的types。 我会build议将您的Excel数据转换为文本文件格式..然后填充每行的文本文件和Excel文件数据到string列表。
然后,您可以使用LINQ或Enumerable方法来比较您的列表。 最快的方法来比较两个List <>