Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';PowerShell中解析这些字符串的最佳方法是什么?_Powershell_Csv_Parsing - Fatal编程技术网

什么';PowerShell中解析这些字符串的最佳方法是什么?

什么';PowerShell中解析这些字符串的最佳方法是什么?,powershell,csv,parsing,Powershell,Csv,Parsing,我的脚本中传递了两个字符串: "Project1,Project2,Project3,Project4" "web,batch,web,components" 字符串来自DevOps工具链中的一个工具,我无法控制输入格式。字符串1可以是任意数量的项目。字符串2的条目数与字符串1中项目的“类型”相同 我需要为包含第一个字符串中的项目的第二个字符串中的每个不同类型发出一个字符串: "Project1,Project3" "Project2" "Project4" 我知道我可以用一堆嵌套的fore

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

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

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

"Project1,Project3"
"Project2"
"Project4"

我知道我可以用一堆嵌套的foreach循环来完成。有没有办法通过哈希表和/或数组来实现这一点

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

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

没有一种优雅的方式将两个数组与内置方法相结合。有点复杂的方法如下:

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

这使得实际的数据搜索任务更加清晰。

在第一个列表中只进行一次搜索

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

($input | ConvertFrom Csv).PSObject.Properties | Group Object Value | ForEach Object{$\ Group.Name-join',}
基本上就是我最终得到的,但效率更高一些。谢谢。更简单:
$ProjectsByType[$ProjectTypes[$i]]]+=@($ProjectNames[$i])
。我从标记为答案的答案中得到了我需要的东西,但我将尝试一下,看看它是否为我需要完成的其他任务提供了更多功能。谢谢。这就是我要找的。一个foreach,但主要是管道。谢谢