【问题标题】:Comparing excel sheet to text file将excel表格与文本文件进行比较
【发布时间】:2014-01-26 16:52:06
【问题描述】:

我有以下来自 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)。

有没有人知道如何处理这种情况。

编辑1:

这是我尝试做的:

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        

    }

【问题讨论】:

  • 请参阅我的 EDIT1。这种实现我想要的方法似乎很复杂,有没有人有更短的方法。
  • 我不明白“比较两个文件”是什么意思。我看不出 doTest() 方法与 excel-txt 比较有什么关系。
  • 我也不知道你想做什么。您能解释一下数据的来源以及您负责处理这些数据的工作吗?

标签: c# excel text time


【解决方案1】:

目前尚不清楚您是如何“比较”时间的,但对于这个答案,我将假设文本文件中的数据在且仅当其时间戳在 x 分钟内(默认Excel 时间戳的 x = 5)。

我的建议是为此使用名为 Schematiq 的 Excel 插件 - 您可以从 http://schematiq.htilabs.com/ 下载此插件(大约 9MB)(参见下面的屏幕截图)。它可免费用于个人非商业用途。 (免责声明:我为 Schematiq 的作者 HTI Labs 工作。)

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

接下来,我们需要一个 Schematiq 的“模板函数”,它将获取开始时间和结束时间并返回一个时间范围。此模板显示在此处:

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

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

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

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

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

“最终结果”本身在此处放大显示:

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

所有数据链接都代表了 Schematiq 函数的使用 - 语法与 Excel 非常相似,因此很容易上手。例如,最后一个单元格中的调用是:

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

这会从单元格 D21 中的 Schematiq 表中选择除“数据”和“文本文件”列之外的所有列(此函数的最终布尔参数表示“全部除外”)。

我建议下载 Schematiq 并亲自尝试一下 - 我很乐意通过电子邮件将我整理的工作簿副本发送给您,因此它应该立即运行。

【讨论】:

    【解决方案2】:

    我不确定我是否理解您的意思,但我会先使用; 分隔符将 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();
    

    当然,我使用字符串作为数据类型,因为我不知道它们应该是什么类型的对象。让我知道这对你有什么作用。

    【讨论】:

      【解决方案3】:

      如果这是一次性比较,我建议将文本文件拉入 Excel(如果需要,使用 Text-to-Columns 工具)并在其中使用内置函数进行比较。

      但是,如果您需要经常这样做,那么 Tarec 建议的方法将是一个好的开始。您似乎正在尝试比较给定时间跨度内的单独事件日志 (?) - 如果您解析为具有 DateTime 属性的对象而不是比较文本字符串,您的生活会更轻松。

      【讨论】:

        【解决方案4】:

        将来自 2 个来源(excel 和文本文件)的数据填充到 2 个列表中。
        确保列表是相同的类型。 我建议将您的 Excel 数据转换为文本文件格式 .. 然后将每一行文本文件和 Excel 文件数据填充到字符串列表中。
        然后您可以使用 LINQ 或 Enumerable Methods 比较您的列表。 Quickest way to compare two List<>

        【讨论】:

          猜你喜欢
          • 2018-08-21
          • 2022-06-12
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 1970-01-01
          • 2020-02-29
          • 1970-01-01
          • 2023-01-21
          相关资源
          最近更新 更多