2016-11-21 155 views
3

我獲得兩個字符串傳遞到我的腳本:PowerShell解析這些字符串的最佳方式是什麼?

"Project1,Project2,Project3,Project4" 
"web,batch,web,components" 

的字符串來自於我們的DevOps工具鏈的工具,我沒有對輸入格式的控制。字符串1可以是任意數量的項目。串2將是相同的數量的條目,在串中的項目的「類型」 1

我需要發出一個串的第二串中包含從第一個字符串的項目的每個不同類型:

"Project1,Project3" 
"Project2" 
"Project4" 

我知道我可以做一堆嵌套的foreach循環。有沒有辦法做到這一點與哈希表和/或數組?

+0

'($輸入| ConvertFrom-CSV)搜索.PSObject.Properties |組對象值| ForEach-Object {$ _ .Group.Name -join','}' – PetSerAl

回答

0

只有一個在第一個列表

$projects = "Project1,Project2,Project3,Project4" -split ',' 
$types = "web,batch,web,components" -split ',' 

$linenumber = 0 

$projects |%{New-Object psObject -Property @{Project=$_;TypeProject= $types[$linenumber]};$linenumber++} | 
group TypeProject | 
select Name, @{N="Projects";E={$_.Group.Project -join ","}} 
+0

現在,我正在尋找。一個foreach,但主要是管道。謝謝! –

6

你可以把原來的輸入字符串到數組與-split操作:

$ProjectNames = "Project1,Project2,Project3,Project4" -split ',' 
$ProjectTypes = "web,batch,web,components" -split ',' 

然後創建一個空的哈希表包含的類型對項目名稱映射

$ProjectsByType = @{} 

最後迭代兩個陣列按類型對項目名稱進行分組:

for($i = 0; $i -lt $ProjectNames.Count; $i++){ 
    if(-not $ProjectsByType.ContainsKey($ProjectTypes[$i])){ 
     # Create key and entry as array if it doesn't already exist 
     $ProjectsByType[$ProjectTypes[$i]] = @() 
    } 
    # Add the project to the appropriate project type key 
    $ProjectsByType[$ProjectTypes[$i]] += $ProjectNames[$i] 
} 
$ProjectsByType.Keys |ForEach-Object { 
    $ProjectsByType[$_] -join ',' 
} 

你也可以創建兩個數組對象,並使用Group-Object將它們分組:

$Projects = for($i = 0; $i -lt $ProjectNames.Count; $i++){ 
    New-Object psobject -Property @{ 
     Name = $ProjectNames[$i] 
     Type = $ProjectTypes[$i] 
    } 
} 

$Projects |Group-Object -Property Type 

這是更有趣的現在,您可以選擇您需要的字符串按項目類型分組如果你想進行項目的進一步處理,如果你只是需要字符串的第一種方法更容易

+0

本質上是我最終得到的,但效率更高一點。謝謝。 –

+0

簡單:'$ ProjectsByType [$ ProjectTypes [$ i]] + = @($ ProjectNames [$ i])''。 –

5

有沒有真正的優雅通過內置方法將兩個數組組合在一起的方式。一個有點令人費解的方式將是以下:

$projects = $projectString -split ',' 
$types = $typeString -split ',' 
0..($projects.Count) | group { $types[$_] } | % { $projects[$_.Group] -join ',' } 

然而,該第一生成索引到所述陣列組和以後對其進行格式化,這本質上是一種有點玄乎(而不是非常理解的)。我傾向於預處理數據以真實反映我正在操作的數據:

$projects = $projectString -split ',' 
$types = $typeString -split ',' 
$projectsWithType = 0..($projects.Count) | % { 
    [pscustomobject]@{ 
    Project = $projects[$_] 
    Type = $types[$_] 
    } 
} 
$projectsWithType | group Type | % { $_.Group -join ',' } 

這使得實際的數據管理任務更加清晰。

+0

我有我需要從我標記爲答案的答案中得到我需要的東西,但是我會稍微玩一下,看看它是否爲我需要做的其他任務提供了更多的功能。謝謝。 –

相關問題