2016-01-22 202 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