将Excel工作表与文本文件进行比较

时间:2014-01-26 16:52:06

标签: c# excel text time

我从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        

    }

4 个答案:

答案 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数据表如下所示:

enter image description here

接下来我们需要一个Schematiq'模板函数',它将占用开始和结束时间并返回一系列时间。此模板显示在此处:

enter image description here

此函数的输入值实际上是“虚拟”值 - 函数由Schematiq在内部编译,然后可以使用所需的任何输入进行调用。 “结果”单元格包含以“〜#...”开头的文本(以及前几个单元格中的几个) - 这表示包含表格,函数或其他结构的 Schematiq数据链接。要查看它,您可以单击单元格并查看 Schematiq Viewer ,它在Excel中显示为任务窗格,如下所示:

enter image description here

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

现在一切都已设置完毕,我们只需导入文本文件并让Schematiq为我们完成工作。对于Excel数据中的每个“时间组”,将生成适当的时间范围,并将其与文本文件进行匹配。您将返回所有匹配的数据,以及Excel和文本文件中的任何不匹配数据。必要的计算如下所示:

enter image description here

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

enter image description here

要清楚,您在此屏幕截图中看到的是工作簿的全部内容 - 除了您看到的实际单元格之外,没有其他任何计算发生。

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

enter image description here

这正是您所追求的比较(故意引入错误 - 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<>