簡體   English   中英

PowerShell:數組到多個數組

[英]PowerShell: Array to multiple array

我有一個簡單的數組,使用以下內容創建(循環未顯示)

$tmpArray  += $AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string  + ";" + $_.Value

是否有可能將內容添加到多維數組?

稍后我將不得不過濾條目。 有了這個設置,這是不可能的。 我在以下人員的幫助下進行了嘗試

$list = ConvertFrom-Csv $tmpArray -Header "GroupID", "Language", "TextID", "Text" -Delimiter ";"
$list | Sort-Object -Property GroupID, Language, TextID#

不幸的是,轉換為 excel 並沒有導致列分離......

請在這里找到我的代碼

foreach ($file in $fileNames) {

$Content = [xml](Get-Content -Path $file.FullName)

$ns = New-Object System.Xml.XmlNamespaceManager($Content.NameTable)
$ns=@{DEF="http://br-automation.co.at/AS/VC/Project"}

$AlarmgroupIndex = Select-Xml -Xml $Content -XPath "//DEF:Property[contains(@Name,'Index')]" -namespace $ns | select -ExpandProperty node
$AlarmgroupIndexString = $AlarmgroupIndex.Value
$AlarmgroupLanguageText = Select-Xml -Xml $Content -XPath "//DEF:TextLayer" -namespace $ns | select -ExpandProperty node
$AlarmgroupIndexMap = Select-Xml -Xml $Content -XPath "//DEF:Index" -namespace $ns | select -ExpandProperty node

$LUT =@{}  
$AlarmgroupIndexMap | foreach{
    $LUT.($_.ID) = $_.Value
}

$tmpArray =@() 
$AlarmgroupLanguageText | foreach{ 

   $LanguageIDString = $_.LanguageId
    
        
        $AlarmgroupTextLayer = Select-Xml -Xml $Content -XPath "//DEF:TextLayer[@LanguageId='$LanguageIDString']/DEF:Text" -namespace $ns | select -ExpandProperty node 

        $AlarmgroupTextLayer | foreach{  

            if($LUT.ContainsKey($_.ID))
            {
                $ID_string = $LUT[$_.ID]
            }
            
            $tmpArray  += $AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string  + ";" + $_.Value 

        }

    $LanguageIDString=""
    
}

$tmpArray | Out-File "$rootPath\test.txt" -Append -Encoding utf8
$list = ConvertFrom-Csv $tmpArray -Header 'GroupID', 'Language', 'TextID', 'Text' -Delimiter ";"
$list | Sort-Object -Property GroupID, Language, TextID

}

TIA

首先:

  • $AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string + ";" + $_.Value $AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string + ";" + $_.Value不是數組而是字符串(子字符串用分號分隔)
  • 盡量避免使用增加賦值運算符 ( += ) 來創建集合(或字符串),因為它是指數級的(意味着成本會隨着每次迭代而增加)。

遺憾的是,您沒有顯示有關循環的更多詳細信息,因為您的問題實際上取決於您如何初始化$tmpArray變量:

  • 如果您以字符串 ( $tmpArray = '' ) 或$Null $tmpArray = '' ,它將繼續附加到該字符串。
  • 如果您以字符串( $tmpArray = @()$tmpArray = @() ,它將繼續附加數組(這可能是您要查找的位置)。

如果您打算使用ConvertFrom-Csv您還可以考慮以字符串開頭並用換行符分隔每一行(例如... + $_.Value + "`r`n"

無論如何,使用ConvertFrom-Csv構建 PowerShell 對象集合也不是一個好主意(原因之一:它將所有值轉換為字符串),正確的 PowerShell 方法是:

$List = 1..3 | Foreach-Object { # replace 1..3 with your enumerator
    [pscustomobject]@{
        AlarmIndex = $AlarmgroupIndexString
        LanguageIndex = $LanguageIDString
        ID = $ID_string
        Value = $_.Value
    }
}

}


根據問題中添加的信息進行更新:
我不確定您的應用程序到底應該做什么,但循環應該是這樣的:

$list = $AlarmgroupLanguageText | foreach { 

   $LanguageIDString = $_.LanguageId

    $AlarmgroupTextLayer = Select-Xml -Xml $Content -XPath "//DEF:TextLayer[@LanguageId='$LanguageIDString']/DEF:Text" -namespace $ns | select -ExpandProperty node 

    $AlarmgroupTextLayer | foreach{  

        if($LUT.ContainsKey($_.ID))
        {
            $ID_string = $LUT[$_.ID]
        }
        
        [pscustomobject]@{
            GroupID = $AlarmgroupIndexString
            Language = $LanguageIDString
            TextID = $ID_string
            Text = $_.Value
        }
    }
} 

$list | Sort-Object -Property GroupID, Language, TextID

我建議您快速瀏覽一下這篇文章: https : //www.andreasbijl.com/powershell-create-collections-of-custom-objects/

您可以使用上面鏈接中描述的示例生成所需的列表。 對於您的情況,它應該類似於:

$list = New-Object System.Collections.ArrayList
your_foreach_loop
{
    $temp = New-Object System.Object
    $temp | Add-Member -MemberType NoteProperty -Name "GroupID" -Value $AlarmgroupIndexString
    $temp | Add-Member -MemberType NoteProperty -Name "Language" -Value $LanguageIDString
    $temp | Add-Member -MemberType NoteProperty -Name "TextID" -Value $ID_string
    $temp | Add-Member -MemberType NoteProperty -Name "Text" -Value $_.Value
    $list.Add($temp)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM