Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell-从大型文本文件创建哈希表并进行搜索_Powershell_Hashtable - Fatal编程技术网

Powershell-从大型文本文件创建哈希表并进行搜索

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])"

我正在使用一个哈希表,我使用一个以CSV格式存储的350万个IP地址的列表构建了这个哈希表,我正在尝试使用通配符搜索这个表

CSV是MaxMind的IP列表,我使用以下代码将其转换为哈希表

[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会占用大量资源