我正在寻找一些PowerShell来将列出的属性转换为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
非常感谢任何帮助。 感谢
答案 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