0

リストされたプロパティを CSV またはテーブルに変換するためのパワーシェルを探しています。リスト内のすべてのレコードが同じプロパティを持つわけではありませんが、「インデックス」プロパティは新しいレコードを示します。

入力

Index:1  
FirstName:Bob  
LastName:Smith  
DOB:1/1/1970  
Index:2  
FirstName:John  
DOB:1/1/1971  
Index:3  
LastName:Jones  
DOB:1/1/1972

出力

FirstName,LastName,DOB  
Bob,Smith,1/1/1970  
John,,1/1/1971  
,Jones,1/1/1972  

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

1

もう一つの例。

$arrInputFile = Get-Content -Path "C:\temp\input.txt"
$strCSVExportPath = "C:\temp\Export.csv"

$arrCSVHeader = @()
Foreach ($strLine in $arrInputFile) {
    If ($arrCSVHeader -notcontains $strLine.Split(":")[0]) {
        $arrCSVHeader += $strLine.Split(":")[0]
    }        
}

$arrCSVOutput = @()
$objCurrentIndexBlock = $null
Foreach ($strLine in $arrInputFile) {    
    If ($strLine.Split(":")[0] -eq "Index") {
        If ($objCurrentIndexBlock -ne $null) {
            $arrCSVOutput += $objCurrentIndexBlock
        }

        $objCurrentIndexBlock = "" | Select-Object -Property $arrCSVHeader
    }

    $objCurrentIndexBlock.$($strLine.Split(":")[0]) = $strLine.Split(":")[1].Replace(" ",$null)

}
$arrCSVOutput += $objCurrentIndexBlock

$arrCSVOutput | Export-Csv -Path $strCSVExportPath -NoClobber -NoTypeInformation -Force
于 2014-08-23T11:01:09.197 に答える
0

ForEach を介して実行し、Index を探してオブジェクトを作成し、再び Index に到達するまでメンバーを追加します。この時点で、前のオブジェクトが出力され、新しいオブジェクトが開始されます。その後、最後のオブジェクトを配列に追加すると、設定が完了します。次に、CSVなどに出力します。

    $RawData = Get-Content C:\Path\To\input.txt
$Record = ""
$Array = $RawData | Where{$_ -Match "(.+?):(.+)"} | ForEach{If($Matches[1] -eq "Index"){if(![string]::IsNullOrWhiteSpace($Record)){$Record};$Record = [PSCustomObject]@{"Index"=$Matches[2].trim()}}Else{Add-Member -InputObject $Record -MemberType NoteProperty -Name $Matches[1] -Value $Matches[2].trim()}}
$Array += $Record
$Props = $Array | ForEach{$_ | Get-Member -MemberType Properties | Select -Expand Name} | Select -Unique
$Props | Where{($Array[0]|Get-Member -MemberType Properties | Select -Expand Name) -notcontains $_} | ForEach{$Array[0]|Add-Member $_ $null}
$Array | Export-Csv C:\Path\To\File.csv -NoTypeInformation

編集:最初のレコードにフィールドがない場合 (たとえば、LastName がない場合)、次のレコードのいずれにもそのフィールドが表示されないという落とし穴が最初の回答にあることに気付きました。各レコードからすべての一意のフィールドのリストを取得し、欠落しているフィールドを null 値を持つ最初のレコードに追加することで、これを修正しました。

Edit2:パトリックの回答と私の回答の両方を見た後、彼のほうがはるかに高速に実行されることに気付いたので、両方の回答を組み合わせた修正版を作成しました。彼から取られたオブジェクト作成のいくつかのテクニックと、私のものから取られた行解析:

$RawData = Get-Content 'C:\temp\input.txt'
$Record = ""
$Array = @()
$Props = $RawData -replace "(.+?):.*","`$1"|select -Unique
ForEach($Line in $RawData){
    $Line -Match "(.+?):(.+)" | Out-Null
    If($Matches[1] -eq "Index"){
        If([string]::IsNullOrEmpty($Array[0])){$Array = @($Record)}else{$Array += $Record}
        $Record = ""|Select -Property $Props
        $Record.Index = $Matches[2].trim()
    }Else{
        $Record.($matches[1]) = $Matches[2].trim()
    }
}
$Array | Export-Csv 'C:\temp\export2.csv' -NoTypeInformation
于 2014-08-22T16:29:58.883 に答える