2016-01-22 199 views
0

我正在使用哈希表來存儲希臘字符中的一些名稱和ID。Powershell哈希表和重複鍵

$hsNames = @{} 
    $hsNameID = 1 

    $name = "Νικος" 

    $hsNames.Add($name, $hsNameID) 
    $hsNameID++ 

    $name = "Νίκος" 
    $hsNames.Add($name, $hsNameID) 

    $hsNames 

的上述的輸出是:

 
Name       Value  
----       -----  
Νικος       1            
Νίκος       2 

這意味着,兩個鍵都爲相同的名稱創建當在其中的一個希臘口音。現在我不希望發生這種情況,我只需要一個具有第一個ID(1)的密鑰 - 即MySQL中utf8_unicode_ci的行爲。我想我需要以某種方式告訴powershell在字符串比較中使用Unicode排序算法(http://www.unicode.org/reports/tr10/tr10-33.html)。但是如何?

+0

你解決了你的問題嗎? –

回答

1

有趣的問題,即使有人可能認爲這兩個名稱不同因爲的口音。您必須決定是否存儲原始拼寫和「標準化」拼寫,或只是標準拼寫,因爲轉換是單向過程。

我發現兩個鏈接提供了一種方法來解決問題。 Ignoring accented letters in string comparisonPowerShell version of this same C# code

使用在ISE的PowerShell腳本,我能寫:

$hsNames = @{} 
$hsNameID = 1 

$name1 = "Νικος" 

$hsNames.Add($name1, $hsNameID) 
$hsNameID++ 

$name2 = "Νίκος" 
$hsNames.Add($name2, $hsNameID) 

$hsNames 

$new1 = Remove-StringDiacritic $name1 
$new2 = Remove-StringDiacritic $name2 

"With Diacritic removed" 
$new1 
$new2 
$new1 -eq $new2 

輸出功率爲:

Name       Value                                 
----       -----                                 
Νικος       1                                  
Νίκος       2                                  
With Diacritic removed 
Νικος 
Νικος 
True 

在此基礎上,你可以在「正常化」你的字符串在插入你的哈希表之前,你最終會得到一個單一的密鑰而不是你想要的兩個。

+0

是的,當我發佈這個問題後,我發現了這個「正常化」。一個主要的問題是Remove-StringDiacritic函數的性能。 csv數據包含超過100.000.000行,並且每行都有兩個字符串字段。一些首次測試顯示,進口過程減緩了80%。所以,我不會規範化字符串**之前**輸入他們,因爲我最初做的,但使用規範化的字符串作爲哈希表中的值,只有當原始不存在... – pankal

+0

另外我很擔心,這種規範化將涵蓋了utf8_unicode_ci所做的一切,但我必須嘗試一下。 – pankal