Powershell将列表格式化的记录转换为表格格式

时间:2014-08-22 16:16:46

标签: powershell formatting text-manipulation

我正在寻找一些PowerShell来将列出的属性转换为CSV或表,并非列表中的所有记录都具有相同的属性,但是"索引"财产表示新记录。

INPUT

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  

非常感谢任何帮助。 感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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),它就不会显示任何一个字段以下记录。我通过从每条记录中获取所有唯一字段的列表,并将任何缺少的字段添加到具有空值的第一条记录中来纠正这一点。

编辑2:在看了帕特里克和我的答案后,我意识到他的跑步速度要快得多,所以创建了一个结合我们答案的修改版本。一些从对象创建的对象创建技术,以及从我的行解析:

$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