【问题标题】:What's the best way in PowerShell to parse these strings?PowerShell 中解析这些字符串的最佳方法是什么?
【发布时间】:2017-04-04 21:58:50
【问题描述】:

我将两个字符串传递到我的脚本中:

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

字符串来自我们 DevOps 工具链中的一个工具,我无法控制输入格式。字符串 1 可以是任意数量的项目。字符串 2 将与字符串 1 中项目的“类型”相同的条目数。

我需要为第二个字符串中的每个不同类型发出一个字符串,其中包含第一个字符串中的项目:

"Project1,Project3"
"Project2"
"Project4"

我知道我可以用一堆嵌套的 foreach 循环来做到这一点。有没有办法用哈希表和/或数组来做到这一点?

【问题讨论】:

  • ($input | ConvertFrom-Csv).PSObject.Properties | Group-Object Value | ForEach-Object {$_.Group.Name -join ','}

标签: powershell csv parsing


【解决方案1】:

在第一个列表中只有一个搜索

$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 ","}}

【讨论】:

  • 现在这就是我想要的。一个 foreach,但主要是管道。谢谢!
【解决方案2】:

实际上并没有一种优雅的方式将两个数组与内置方法组合在一起。一种有点复杂的方式如下:

$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 ',' }

这使得实际的数据处理任务更加清晰。

【讨论】:

  • 我有我需要的东西,可以从我标记为答案的答案中得到我需要的东西,但我会尝试一下,看看它是否能给我更多的功能我需要做的其他任务。谢谢。
【解决方案3】:

您可以使用-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

如果您想对项目进行进一步处理,这会更有趣,如果您只需要字符串,第一种方法更容易

【讨论】:

  • 基本上是我最终得到的,但效率更高一些。谢谢。
  • 更简单:$ProjectsByType[$ProjectTypes[$i]] += @($ProjectNames[$i]).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2011-09-05
  • 2013-12-20
  • 2011-03-13
  • 1970-01-01
相关资源
最近更新 更多