如何从第一个元素的值返回嵌套数组所在的位置?

时间:2015-10-08 12:41:39

标签: arrays powershell

希望这个标题有意义!

我有一个数组,由48组3个数字组成。我现在要做的是根据该组中的第一个数字,以预定义的顺序打印这些3个数字的集合。子数组是这样的:

@($label, $number1, $number2)

这些将有48套,标签始终是唯一的,并从CSV文件的标题中提取。 (CSV文件通过各种PowerShell脚本提供,以整理其标题并将其转换为XLS,并运行各种宏。)它们按文件顺序进行,但我想以另一个预先定义的顺序将它们打印出来选择。

因此,为了按照我想要的标签顺序打印它们,我需要能够测试子数组的$ label部分。如果它与我想要的标签匹配,则打印出3出的一组。

到目前为止,为了测试我的代码,我构建了一个填充数组的循环:

$results = @(1 .. 48)

$label = 148
$var1 = 5
$var2 = 3

for($i = 0; $i -le 47; $i++) {
    $results[$i] = @($label, $var1, $var2)
}

我现在需要做的是按特定顺序打印这些3组,我将按标签指示。下一段代码可能只是一个自定义函数,如posArray($ label)。当我输入它时,我意识到打印带有标签的数组部分同样有用,它不一定要告诉我它的位置。

如果可能的话,请随时建议更好的方法来构建它。它必须在PowerShell中运行。我想的可能是一个哈希,但因为它的两个变量而不仅仅是一对我不确定。

我试图绕回循环并检查每个嵌套数组中的第一个元素,但它打印出来" System.Object []"很多次。

for($i = 0; $i -le 47; $i++) {
    if($results[$i][0] -eq $label) {
        Write-Host "$results[$i]"
    }
}

所以我不确定那里发生了什么。

理想情况下,如果是这种情况(for循环搜索并打印$ label的1集)我将循环放在函数中,通过FunctionName($ label)调用函数,我会调用函数多次按照我想要的顺序贴上标签。

论文结束......

1 个答案:

答案 0 :(得分:2)

我认为您可以使用自定义对象获得更好的体验,而不是嵌套数组。这应该在2.0

中工作
$dasData = 0..47 | ForEach-Object{
    New-Object -TypeName psobject -Property @{
        # Create an object with a nested array.
        Index = $_
        Details = [char]([int]$_ + 65),(Get-Random -Minimum 0 -Maximum 50),(Get-Random -Minimum 0 -Maximum 50)
    }
}

我刚创建了一个对象数组,其中每个对象都有一个索引和一个包含3个值的数组。忽略实际值。它只是一些ANSI可打印字符和随机数。查看$dasData ...

的前几个元素
Details     Index
-------     -----
{A, 15, 6}      0
{B, 28, 31}     1
{C, 41, 23}     2
{D, 0, 7}       3

现在,我们可以使用标准的PowerShell cmdlet来获取您要查找的信息。

$dasData | Where-Object{$_.Details[0] -ceq "F"}

我们正在寻找与第一个细节元素等于大写字母F的元素匹配的数据。这将返回数组中的第5个元素。

Details     Index
-------     -----
{F, 49, 43}     5

如果你真的只对index感兴趣,那么一个简单的选择就可以得到你。

$dasData | Where-Object{$_.Details[0] -ceq "F"} | Select-Object -ExpandProperty Index

在第二个代码集中,您没有正确调用元素,因为您将其作为字符串进行转换。

Write-Host "$results[$i]" 

应该是以下任何一种。

Write-Host "$($results[$i])" 
Write-Host $results[$i]