我有一个excel文件以及一个config xml文件。这个配置xml文件包含excel文件中存在的一些键。我的目标是解析xml文件并找出这些键是否存在于excel文件中。我使用了2个循环来完成这个任务。这需要花费很多时间才能完成。下面给出了我的代码语法。
foreach(node in xmlfile)
{
foreach(key in excelfile)
{
if(key.Equals(node))
{
print node +"found"
}
}
}
上述代码的问题在于搜索excel文件需要花费大量时间。我的excel文件太大了,除了xml文件之外还有很多键。
还有其他更好的方法来完成这项任务吗?
答案 0 :(得分:1)
解决方案尽可能低效。那是因为
foreach(node in xmlfile)
{
foreach(key in excelfile)
{
if(key.Equals(node))
{
将执行xmlfile的rowcount * excelfile的rowcount比较。如果你有两个文件,即1 000行,你将进行1 000 * 1 000 = 1 000 000比较操作。
取代这种压倒性的工作,取一个文件并将节点值读入哈希表。然后循环遍历另一个文件并检查是否从哈希表中找到了值。
答案 1 :(得分:0)
这可能不是你的最终解决方案,但它非常简单有效,只需将较大的循环作为外部循环而小循环是内部循环,然后在找到密钥时中断:
foreach(key in excelfile)
{
foreach(node in xmlfile)
{
if(key.Equals(node))
{
print node +"found"
break;
}
}
}
这将消除每个xml迭代的整个大excel文件的开销循环(当使用break时,否则没有差异),相反,它将循环遍历每个excel迭代的小xml文件,甚至打破匹配。
答案 2 :(得分:0)
一种选择是从其中一个集合构建交替正则表达式,然后将其与-match运算符一起用于另一个集合:
$collection = 1..10
$even = 2,4,6,8,10
[regex]$even_regex = ‘(?i)^(‘ + (($even |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’
$collection -match $even_regex |
foreach { "Found $_ "}
Found 2
Found 4
Found 6
Found 8
Found 10