我从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与文本),每个组的时间不同。 Group1(data1到Data4),group2(Data5-data8)。
有没有人知道如何处理这种情况。
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
}
答案 0 :(得分:3)
你是如何“比较”时间并不是很清楚,但是对于这个答案,我会假设当且仅当时间戳在x分钟内时,才会比较来自文本文件的数据(默认值)到x = 5)的Excel时间戳。
我的建议是使用名为 Schematiq 的Excel加载项 - 您可以从http://schematiq.htilabs.com/下载此文件(约9MB)(请参阅下面的屏幕截图)。它可以免费用于个人非商业用途。 (免责声明:我为Schematiq的作者HTI Labs工作。)
但是,我会在Excel中处理时间。首先,我们将计算Excel时间戳的开始/停止限制。例如,第一次(06:07:00)我们想要范围6:02-6:12。我们还将实际的“开始”和“结束”时间分解为小时,分钟和秒,以便以后轻松完成。 Excel数据表如下所示:
接下来我们需要一个Schematiq'模板函数',它将占用开始和结束时间并返回一系列时间。此模板显示在此处:
此函数的输入值实际上是“虚拟”值 - 函数由Schematiq在内部编译,然后可以使用所需的任何输入进行调用。 “结果”单元格包含以“〜#...”开头的文本(以及前几个单元格中的几个) - 这表示包含表格,函数或其他结构的 Schematiq数据链接。要查看它,您可以单击单元格并查看 Schematiq Viewer ,它在Excel中显示为任务窗格,如下所示:
换句话说,Schematiq允许您在单个单元格中保存整个数据表。
现在一切都已设置完毕,我们只需导入文本文件并让Schematiq为我们完成工作。对于Excel数据中的每个“时间组”,将生成适当的时间范围,并将其与文本文件进行匹配。您将返回所有匹配的数据,以及Excel和文本文件中的任何不匹配数据。必要的计算如下所示:
因此,您的Excel工作表很小,单击最后一个单元格将在Schematiq Viewer中显示最终结果。结果,包括Excel数据和“模板计算”,如下所示:
要清楚,您在此屏幕截图中看到的是工作簿的全部内容 - 除了您看到的实际单元格之外,没有其他任何计算发生。
'最终结果'本身在这里放大显示:
这正是您所追求的比较(故意引入错误 - Data9 - 在文本文件中,以演示匹配)。然后,您可以进行所需的任何比较或进一步分析。
所有数据链接都代表Schematiq函数的使用 - 语法与Excel非常相似,因此很容易获取。例如,最后一个单元格中的调用是:
=tbl.SelectColumns(D21, {"Data","Text file"}, TRUE)
这将从单元格D21中的Schematiq表中选择除“数据”和“文本文件”列之外的所有列(此函数的最终布尔参数表示“除了'之外的所有列。)
我建议您下载Schematiq并亲自尝试一下 - 我很乐意通过电子邮件向您发送我放在一起的工作簿副本,所以它应该立即运行。
答案 1 :(得分:0)
我不确定我是否理解你的意思,但我首先将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();
当然我使用字符串作为数据类型,因为我不知道它们应该是什么类型的对象。让我知道这对你有用。
答案 2 :(得分:0)
如果这是一次性比较,我建议只将文本文件拉到Excel中(如果需要,使用Text-to-Columns工具)并在那里与内置函数进行比较。
如果你需要经常这样做,像Tarec建议的那样会是一个好的开始。您似乎在尝试比较给定时间跨度内的单独事件日志(?) - 如果您使用DateTime
属性解析对象而不是比较文本字符串,您的生活会更容易。
答案 3 :(得分:0)
将您的2个来源(excel和文本文件)中的数据填充到2个列表中
确保列表的类型相同。
我建议将Excel数据转换为文本文件格式..然后将每行文本文件和Excel文件数据填充到字符串列表中。
然后,您可以使用LINQ或Enumerable方法比较您的列表。
Quickest way to compare two List<>