2014-04-02 233 views
0

我有一個excel文件以及一個配置xml文件。這個配置xml文件包含一些在excel文件中存在的鍵。我的目標是解析xml文件並找出鍵是否存在在excel文件中。我使用了2個循環來完成這個任務。它需要花費很多時間來完成。我的代碼語法如下。減少執行時間

foreach(node in xmlfile) 
{ 
    foreach(key in excelfile) 
    { 
     if(key.Equals(node)) 
     { 
      print node +"found" 
     } 
    } 
} 

上述代碼的問題是,它需要花費大量的時間來搜索excel文件。我的excel文件非常大,除了xml文件以外,還有很多鍵。

有沒有其他更好的方法來完成這項任務?

+1

這是爲什麼在[tag:python]中? – sshashank124

+0

這是一個常見的編程問題。我只是想知道邏輯 – TVSuser1654136

回答

1

的溶液爲約儘可能低效率的。這是因爲

foreach(node in xmlfile) 
{ 
    foreach(key in excelfile) 
    { 
     if(key.Equals(node)) 
     { 

將執行xmlfile的rowcount * excelfile的rowcount比較。當你拿到兩個1000行的文件時,你會做1 000 * 1 000 = 1 000 000的比較操作。

而不是這樣一個壓倒一切的工作,採取其中一個文件,並讀取節點值到哈希表。然後通過另一個文件循環一次,並檢查是否從哈希表中找到值。

0

這可能不是你的最終解決方案,但它是非常簡單而有效的,只是使大環路外環和小環是內部一個,然後在找到你的關鍵突破:

foreach(key in excelfile) 
{ 
    foreach(node in xmlfile) 
    { 
     if(key.Equals(node)) 
     { 
      print node +"found" 
      break; 
     } 
    } 
} 

這將消除每個xml迭代的整個大型excel文件的開銷循環(當使用break時,否則沒有區別),相反,它將循環遍歷每個excel迭代的小型xml文件,甚至在匹配時斷開。

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