搜索大型Excel文件并高效处理大量数据

本文关键字:处理 数据 高效 大型 Excel 文件 搜索 | 更新日期: 2023-09-27 17:59:59

我已经开始了这个项目,下面是我所拥有的:

Excel文件(exl1),包含450K条记录,每个月还有50000条记录。

exl1格式

invoice#|Box#|Serial-#1|Serial-#2|5-val-enum#1|5-val-enum#2|10-val-enum|4-val-enum|timestamp

ex1:abc123|box1|0987654321|A123456789|Plant|Tree|PersonName1|North|DateTime.Now

ex2:qwe345|box9|12345678901234567890|#NA|Animal|Cat|PersonName1|South|DT.Now

Excel文件(exl2),包含大约5万条记录。(出于解释目的,命名为searchcVal)exl2格式系列1

ex1a:A123456789

ex1b:0987654321

ex2a:12345678901234567890

我要做的是:

  1. 根据exl1的5-val-enum#1的值,将exl2(searchval)中的每个值与序列#1或序列#2进行比较(示例1=植物,示例2=动物)

  2. 如果searchVal以[a-z]搜索序列2开始,则搜索序列1;因此,使用searchVal ex1a搜索col3和serachval ex1b搜索col2

        if (exl1.Rows[columnHeader][col4].ToString() == "Plant")
        {
            string rowVal = exl2.Rows[rowIterator][col0].ToString();
            if (regex.IsMatch(rowVal[0].ToString()))//checks to see if serial1 or  serial2
            {
                if (rowVal == exl1.Rows[rowIterator][col3].ToString())
                {
                    //add matched row to ResultsDT
                }
                else
                {  //next row
                }
            }
            else
            { //search col2 with same procedure
            }
        }
        else
        {//search col2
        }
    
  3. 为了便于解释,假设Person1匹配了400株植物,其中100株是树,100株是灌木,100株为草,100株为花他匹配了400只动物,其中100只分别是猫、狗、蛇和鸟。通过这些匹配,我想将其总结为SUMMARY1:PersonName|Plants|Animals|category3|Category4|Category5每个类别都有一个更详细的名称,如摘要2:人物名称|树木|灌木|草地|通向SUMM1的花朵:人物1|400|400|x|n|y SUMM2(仅限植物):人物1|100|100|100

  4. 最重要的是:在计算时,在不杀死运行3小时的电脑的情况下完成所有这些

搜索大型Excel文件并高效处理大量数据

至少有两个选项:

  1. 将excel视为数据库并检查其性能-以下是如何做到这一点:http://www.beansoftware.com/NET-Tutorials/Excel-ADO.NET-Database.aspx.
  2. 如果选项no 1将这些数据导入到真实数据库(ms-sql、mysql、postgresql等)的速度太慢,请添加适当的索引并在数据库中执行搜索。excel将被视为初始导入的数据源

我假设这里的问题是"我如何有效地执行这些任务?"

答案是,你不应该。听起来你正试图以低廉的价格进行OLAP(除了,嗯,这可能不是严格在线进行的),而且已经有很多解决方案可供选择。

由于您已经有了使用excel电子表格的既定程序,PALO可以满足您的需求(编辑:它是免费的)。

或者,您所拥有的是一组非规范化的记录;如果将其规范化为多个集合&将它输入到数据库中(显然使用脚本),就可以让数据库处理密集的计算编辑:有很多免费的数据库可以使用(SQL是一种语言,而不是一个品牌)。例如PostgSQL、MySQL

如果你坚持要解析文件&你自己分析文件,然后我建议你修改你的算法做两件事:

首先,将你的5万张唱片放入尽可能少的内存中。显然,您不想将记录存储为50k字符串:解析它们,并建立一个只允许您访问所需信息的内存结构 编辑:永远不要误解您的输入数据。

其次,修改您的算法,使其可以逐段运行。目前,你有一组50万张唱片,另一组45万张唱片。听起来你希望每月(或更频繁地)在全套唱片上运行你的程序+在45万张记录中添加的任何唱片。如果你开始存储增量结果,你可以构建你的脚本,使其一次处理(例如)从你的450k记录集中最多10k条记录,并按顺序运行你的脚本的几个实例,你可以避免每月重新分析整个450k记录,还可以有一种方便的方法来停止&中途启动进程(使用某种父脚本)。

对于更复杂的方法,请参阅适用于算法的"分而治之"。

根据Excel更新/查询的运行比例,简单地将值读取到sql server数据库中并在那里查询/处理数据可能是个好主意?我可以想象,将值读取到sql server中需要一些时间,但查询应该不需要时间。。。