Performance 加快通过导入CSV获取的powershell中的数据比较
简单的问题,但棘手的问题 我有两个从Excel导出的CSV文件,一个有65k行,另一个大约有50k行。我需要根据该条件合并这两个文件中的数据: 其中File1.Username-eq File2.Username 请注意,两个文件中用户名属性的数据类型如下:Performance 加快通过导入CSV获取的powershell中的数据比较,performance,csv,powershell,Performance,Csv,Powershell,简单的问题,但棘手的问题 我有两个从Excel导出的CSV文件,一个有65k行,另一个大约有50k行。我需要根据该条件合并这两个文件中的数据: 其中File1.Username-eq File2.Username 请注意,两个文件中用户名属性的数据类型如下: IsPublic IsSerial Name BaseType
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
很明显,通过65k x 50k对象属性进行循环比较需要1天23个小时,正如我在测量仅在10行上运行的脚本时估计的那样
目前我正在考虑几种解决方案,比如拆分CSV文件,同时在不同的powershell会话中运行不同的部分,同时为powershell.exe提供实时优先级,但这很麻烦,而且我还没有测试过该选项,因此无法报告性能的实际提高
我想知道是否应该改为使用数据类型,例如.ToString.GetHashCode(),但我也尝试了该选项,奇怪的是,比较字符串与字符串时,执行时间比比较哈希和整数与哈希和整数时要快
长话短说,我正在寻找一种比较65k x 50k字符串变量的超快速方法
任何帮助都将不胜感激:)
谢谢
举例说明:
好的,这里有一个隐喻性的例子。假设您有一个包含宇航员(太空)姓名和设备的数据库,另一个包含宇航员姓名和设备的数据库
海洋探险家(海洋)。
因此,在空间数据集中,例如:
First Name,Last name, Username, space gear,environment.
然后第一行数据将如下所示:
Neil,Armstrong,Stretch,spacesuit,moon
在海洋数据集中,您将拥有:
First Name,Last name, Username, birthdate, diving gear,environment
First Name,Last name, Username, birthdate, diving gear,environment
使用以下数据:
Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Neil,Armstrong,Stretch,1930-08-05,diving suit,ocean
ocean,Jacques,Cousteau,Jyc,1910-06-11,diving suit,,ocean
space,Neil,Armstrong,Stretch,1930-08-05,,space suit,moon
ocean,Neil,Armstrong,Stretch,1930-08-05,diving suit,,ocean
现在假设尼尔·阿姆斯特朗在某个时候注册了一个潜水课程,并被添加到海洋数据集中。
在海洋数据集中,您现在拥有:
Dataset,First Name,Last name, Username, birthdate, diving gear, space gear,environment
使用以下数据:
Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Neil,Armstrong,Stretch,1930-08-05,diving suit,ocean
ocean,Jacques,Cousteau,Jyc,1910-06-11,diving suit,,ocean
space,Neil,Armstrong,Stretch,1930-08-05,,space suit,moon
ocean,Neil,Armstrong,Stretch,1930-08-05,diving suit,,ocean
交给我数据的人给了我第三个数据集,它是其他两个数据集的“混合”:
在混合数据集中,您现在有:
Dataset,First Name,Last name, Username, birthdate, diving gear, space gear,environment
使用以下数据:
Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Neil,Armstrong,Stretch,1930-08-05,diving suit,ocean
ocean,Jacques,Cousteau,Jyc,1910-06-11,diving suit,,ocean
space,Neil,Armstrong,Stretch,1930-08-05,,space suit,moon
ocean,Neil,Armstrong,Stretch,1930-08-05,diving suit,,ocean
因此,我的任务是使数据集混合如下:
First Name,Last name, Username, birthdate, diving gear, space gear,environment
Jacques,Cousteau,Jyc,1910-06-11,diving suit,,ocean
Neil,Armstrong,Stretch,1930-08-05,diving suit,space suit,(moon,ocean)
最重要的是,可能会发生两种极其愚蠢的情况:
1) 同一个人可以多次出现在空间数据集或海洋数据集中,但用户名不同。
2) 两个完全不同的用户可以在空间数据集中共享同一用户名,但不能在海洋数据集中共享。其中的用户名是唯一的。是的,你读对了,库斯托和阿姆斯特朗可能都有相同的用户名
我确实已经考虑过在我的牙齿卡在任务中之前将数据清理一下的可能性,但那是不可能的。
我必须接受现实,不能改变任何事情
因此,我做的第一件事是分离用户名字段、组对象-属性用户名的记录数,我的工作集中在给定用户(如Neil Armstrong)在这两个数据集中的情况
当只有一张像库斯托这样的唱片时,它是直截了当的,我保持原样。当每个数据集中有一条记录时,我需要合并数据,当一个用户名有两条以上的记录时,可以公平地说,这是一个完全混乱的局面,尽管我不介意让它们保持现在的状态(特别是因为数千条记录都有一个[string]::IsNullOrEmpty($username)=$true,因此它们计为大于2条记录的数字..)
我希望它更有意义
目前,我想重点讨论给定用户名在空间和海洋数据集中出现一次的情况,我知道这并不复杂,但我使用的算法使整个过程非常缓慢:
0-创建一个空数组
1-从空间数据集获取行
2-从海洋数据集获取行
3-创建一个哈希表,其中包含属性不为空的两个数据集的属性
4-创建一个psobject来封装哈希表
5-将该对象添加到数组中
这需要花费很多时间,因为我说的是太空中的65k记录和海洋中的50k记录
所以我想知道有没有更好的方法
谢谢 是的,我已经按用户名按升序对这两个文件进行了排序。你的估计不太准确。定位文件、获取文件句柄、推断标题顺序等所花费的时间是相同的,无论您有10行还是10行。用户名列中的值在每个文件中都是唯一的?不进行比较,只进行组合。看看这个答案对您的作用:(除非您有一个用户的多个记录,在这种情况下,您的比较不会很好地工作)您是否尝试过
比较对象(导入csv-Path“C:\temp\Test1.csv”)(导入csv-Path“C:\temp\Test2.csv”)-属性用户名-ExcludeDifferent-IncludeEqual
?