我正在尝试创建一个 n * m 矩阵,它将完成以下设计:
我正在使用的第一个循环是返回一个我不理解的错误,即动态生成的数组名已经存在。
代码:
$Source = (Import-Csv "C:\Users\m012407\Desktop\DataBase 42\DB--Data\APPcsv - Copy.csv" -Delimiter ";" -Header ("Application", "Project"))
# An Array to hold each project by name.
$projectName = $source | Select-Object Project -Unique
$ProjectArray = @("")
foreach ($project in $projectname) {
$ProjectArray += $Project.Project
}
# An Array to hold each application by name.
$ApplicationName = $source | Select-Object Application -Unique
$ApplicationArray = @()
foreach ($App in $ApplicationName) {
$ApplicationArray += $App.Application
}
# An Array to hold the Combined values of each EXISTING application and project combination.
$ComparisonArray = @()
$ComparisonSource = foreach ($Value in $Source) {
$ComparisonString = $Value.Project + $Value.Application
$ComparisonArray += $ComparisonString
}
# The Matrix, eventually n*m as each dynamically generated array is added to it
$Matrix = @()
##loop1 Now defunct
#for ($iP = 0; $iP -le $ProjectArray.count; $iP ++) {
# New-Variable -Name Row$iP -Value @($ProjectArray[$iP])
# $Matrix += $_
#}
这个代码当然还没有完成,但是在测试过程中,它反复无法以我可以调用矩阵和显示的方式正确地将Row$iP
数组添加到矩阵中。错误消息指出变量row$iP
(对于每个尝试的行,1-20)已经存在。
我一直在网上搜索其他帖子和指南,我不确定我做了什么会妨碍我目前的功能。显然我遗漏了一些基本的东西或者没有完全理解的东西,所以任何帮助都会受到高度赞赏。
感谢Ansgar Wiechers的帮助,我已经修改了我的代码以便在这台电机上运行:
$Matrix = New-Object 'Object[,]' $ProjectArray.Count, $ApplicationArray.Count
for ($i=0; $i -lt $ProjectArray.Count; $i++) {
for ($j=0; $j -lt $ApplicationArray.Count; $j++) {
$Matrix[$i, $j] = $ProjectArray[$i] + $ApplicationArray[$j]
if ($Matrix[$i, $j] -match $comparisonArray) {
$Matrix[$i, $j] = $True
} else {
$Matrix[$i, $j] = $False
}
}
}
使矩阵的每个值都为假是不幸的。 不过我会继续关注它。
答案 0 :(得分:3)
首先,我会简化$ProjectArray
和$ApplicationArray
的创建:
$ProjectArray = @($source | Select-Object -Expand Project -Unique)
$ApplicationArray = @($source | Select-Object -Expand Application -Unique)
此外,您正在创建的内容称为"锯齿状" array(基本上是每个都有一个维度的数组数组),它与2维数组(一个具有2维的数组对象)不同。对于你的矩阵,最好创建一个实际的二维数组:
$Matrix = New-Object 'Object[,]' $ProjectArray.Count, $ApplicationArray.Count
这将允许您填充矩阵,如下所示:
$source | ForEach-Object {
$row = $ProjectArray.IndexOf($_.Project)
$col = $ApplicationArray.IndexOf($_.Application)
$Matrix[$row, $col] = $true
}
空字段被解释为false,或者您可以在处理$false
的元素之前使用$source
值初始化矩阵:
for ($i=0; $i -lt $ProjectArray.Count; $i++) {
for ($j=0; $j -lt $ApplicationArray.Count; $j++) {
$Matrix[$i, $j] = $false
}
}