搜索大型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
我要做的是:
根据exl1的5-val-enum#1的值,将exl2(searchval)中的每个值与序列#1或序列#2进行比较(示例1=植物,示例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 }
为了便于解释,假设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
最重要的是:在计算时,在不杀死运行3小时的电脑的情况下完成所有这些
至少有两个选项:
- 将excel视为数据库并检查其性能-以下是如何做到这一点:http://www.beansoftware.com/NET-Tutorials/Excel-ADO.NET-Database.aspx.
- 如果选项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中需要一些时间,但查询应该不需要时间。。。