2016-11-21 118 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

我有我需要从我标记为答案的答案中得到我需要的东西,但是我会稍微玩一下,看看它是否为我需要做的其他任务提供了更多的功能。谢谢。 –

相关问题