Powershell-从大型文本文件创建哈希表并进行搜索
我正在使用一个哈希表,我使用一个以CSV格式存储的350万个IP地址的列表构建了这个哈希表,我正在尝试使用通配符搜索这个表 CSV是MaxMind的IP列表,我使用以下代码将其转换为哈希表Powershell-从大型文本文件创建哈希表并进行搜索,powershell,hashtable,Powershell,Hashtable,我正在使用一个哈希表,我使用一个以CSV格式存储的350万个IP地址的列表构建了这个哈希表,我正在尝试使用通配符搜索这个表 CSV是MaxMind的IP列表,我使用以下代码将其转换为哈希表 [System.IO.File]::ReadLines("C:\temp\iptest.csv") | ForEach-Object { $data= $_.split(','); $ht = @{"geoname_id"="$($data[1])"
[System.IO.File]::ReadLines("C:\temp\iptest.csv") | ForEach-Object { $data= $_.split(','); $ht = @{"geoname_id"="$($data[1])";"registered_country_geoname_id"="$($data[2])"}
$name = $($data[0])
$mainIPHhash.add($name, $ht)}
代码只是取出CIDR和相应的城市/国家代码。
这工作得很好,在两分钟多一点的时间内构建了这个表,但是我现在面临的问题是在这个哈希表中搜索通配符条目
如果我搜索完整的CIDR,搜索以毫秒为单位
$mainIPHhash.item("1.0.0.0/24")
Measure command reports - TotalSeconds : 0.0001542
但是,如果我需要进行通配符搜索,它必须在哈希表中循环查找类似的值,这需要很长时间
$testingIP = "1.0.*"
$mainIPHhash.GetEnumerator() | Where-Object { $_.key -like $testingIP }
Measure command reports - TotalSeconds : 33.3016279
有没有更好的方法来搜索哈希表中的通配符项
干杯
编辑:
使用正则表达式搜索,我可以将它缩短到19秒。但速度仍然非常缓慢
$findsStr = "^$(($testingIP2).split('.')[0])" +"\."+ "$(($testingIP2).split('.')[1])" +"\."
$mainIPHhash.GetEnumerator() | foreach {if($_.Key -match $findsStr){#Dostuff }}
上面的代码获取IP地址的前两个八位字节,并使用正则表达式在哈希表中查找它们
Days : 0
Hours : 0
Minutes : 0
Seconds : 19
Milliseconds : 733
Ticks : 197339339
TotalDays : 0.000228402012731481
TotalHours : 0.00548164830555556
TotalMinutes : 0.328898898333333
TotalSeconds : 19.7339339
TotalMilliseconds : 19733.9339
您可以获取IP列表并对列表执行
-like
或-match
。两者都应该比Where对象
子句快
$mainIPhash.Values -like '1.0.*'
$mainIPhash.Values -match '^1\.0\.'
其他解决方案可能是,使用组对象:
$contentcsv=import-csv "C:\temp\iptest.csv" -Header Name, geoname_id, registered_country_geoname_id |Group Name
$contentcsv | where Name -like '1.0.*'
先生,你是个传奇人物。这非常有效。非常感谢。哪个更快?我有一个很大的清单,有很多副本,它们相当标准。第一个总毫秒的Out Out from measure命令:0.1165。第二个总数毫秒:0.1237谢谢!唯一的问题是用这么大的文件导入csv会占用大量资源