Excel powershell转置并仅保留一组标头
我有一个如下所示的数据集Excel powershell转置并仅保留一组标头,excel,powershell,Excel,Powershell,我有一个如下所示的数据集 headers data ip 192.168.1.1 netmask 255.255.255.0 description class C ip 172.20.1.1 netmask 255.255.0.0 description class B ip 10.0.0.1
headers data
ip 192.168.1.1
netmask 255.255.255.0
description class C
ip 172.20.1.1
netmask 255.255.0.0
description class B
ip 10.0.0.1
netmask 255.255.255.0
description class A
我如何将其转化为我的预期产出:
ip netmask description
192.168.1.1 255.255.255.0 class C
172.20.1.1 255.255.0.0 class B
10.0.0.1 255.0.0.0 class A
目前,我正在从CSV导入此数据,如下所示:
$data = import-csv .\data.txt -headers headers,data
如果有一个简单的方法可以在excel中实现这一点,那将是非常棒的
任何援助都将是巨大的。多谢各位 导入数据
$data = Import-Csv .\data.txt -headers headers,data
$data | FT -AutoSize
#删除第一行
get-content $data | select -Skip 1 | set-content "$data-temp"
move "$data-temp" $data -Force
$Duration = Measure-Command {
$b = @()
foreach ($Property in $data.Property | Select -Unique) {
$Props = [ordered]@{ Property = $Property }
foreach ($Server in $data.Server | Select -Unique){
$Value = ($data.where({ $_.Server -eq $Server -and
$_.Property -eq $Property })).Value
$Props += @{ $Server = $Value }
}
$b += New-Object -TypeName PSObject -Property $Props
}
}
Write-Host "Finished transposing " -ForegroundColor Green -NoNewline
Write-Host "$(($data | Get-Member -MemberType Properties).count)/$($data.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows into " -ForegroundColor Green -NoNewline
Write-Host "$(($b | Get-Member -MemberType Properties).count)/$($b.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows in " -ForegroundColor Green -NoNewline
Write-Host $Duration.Milliseconds -ForegroundColor Yellow -NoNewline
Write-Host " Milliseconds" -ForegroundColor Green
$b | FT -AutoSize
$b | Out-GridView
$b | Export-Csv .\newData.csv -NoTypeInformation
#转换表格
get-content $data | select -Skip 1 | set-content "$data-temp"
move "$data-temp" $data -Force
$Duration = Measure-Command {
$b = @()
foreach ($Property in $data.Property | Select -Unique) {
$Props = [ordered]@{ Property = $Property }
foreach ($Server in $data.Server | Select -Unique){
$Value = ($data.where({ $_.Server -eq $Server -and
$_.Property -eq $Property })).Value
$Props += @{ $Server = $Value }
}
$b += New-Object -TypeName PSObject -Property $Props
}
}
Write-Host "Finished transposing " -ForegroundColor Green -NoNewline
Write-Host "$(($data | Get-Member -MemberType Properties).count)/$($data.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows into " -ForegroundColor Green -NoNewline
Write-Host "$(($b | Get-Member -MemberType Properties).count)/$($b.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows in " -ForegroundColor Green -NoNewline
Write-Host $Duration.Milliseconds -ForegroundColor Yellow -NoNewline
Write-Host " Milliseconds" -ForegroundColor Green
$b | FT -AutoSize
$b | Out-GridView
$b | Export-Csv .\newData.csv -NoTypeInformation
newData.csv应该和您期望的一样,如果没有,请再次通知我 导入数据
$data = Import-Csv .\data.txt -headers headers,data
$data | FT -AutoSize
#删除第一行
get-content $data | select -Skip 1 | set-content "$data-temp"
move "$data-temp" $data -Force
$Duration = Measure-Command {
$b = @()
foreach ($Property in $data.Property | Select -Unique) {
$Props = [ordered]@{ Property = $Property }
foreach ($Server in $data.Server | Select -Unique){
$Value = ($data.where({ $_.Server -eq $Server -and
$_.Property -eq $Property })).Value
$Props += @{ $Server = $Value }
}
$b += New-Object -TypeName PSObject -Property $Props
}
}
Write-Host "Finished transposing " -ForegroundColor Green -NoNewline
Write-Host "$(($data | Get-Member -MemberType Properties).count)/$($data.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows into " -ForegroundColor Green -NoNewline
Write-Host "$(($b | Get-Member -MemberType Properties).count)/$($b.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows in " -ForegroundColor Green -NoNewline
Write-Host $Duration.Milliseconds -ForegroundColor Yellow -NoNewline
Write-Host " Milliseconds" -ForegroundColor Green
$b | FT -AutoSize
$b | Out-GridView
$b | Export-Csv .\newData.csv -NoTypeInformation
#转换表格
get-content $data | select -Skip 1 | set-content "$data-temp"
move "$data-temp" $data -Force
$Duration = Measure-Command {
$b = @()
foreach ($Property in $data.Property | Select -Unique) {
$Props = [ordered]@{ Property = $Property }
foreach ($Server in $data.Server | Select -Unique){
$Value = ($data.where({ $_.Server -eq $Server -and
$_.Property -eq $Property })).Value
$Props += @{ $Server = $Value }
}
$b += New-Object -TypeName PSObject -Property $Props
}
}
Write-Host "Finished transposing " -ForegroundColor Green -NoNewline
Write-Host "$(($data | Get-Member -MemberType Properties).count)/$($data.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows into " -ForegroundColor Green -NoNewline
Write-Host "$(($b | Get-Member -MemberType Properties).count)/$($b.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " columns/rows in " -ForegroundColor Green -NoNewline
Write-Host $Duration.Milliseconds -ForegroundColor Yellow -NoNewline
Write-Host " Milliseconds" -ForegroundColor Green
$b | FT -AutoSize
$b | Out-GridView
$b | Export-Csv .\newData.csv -NoTypeInformation
newData.csv应该和您期望的一样,如果没有,请再次通知我 前面的答案没有使用问题中指定的数据,这个答案使用了。它也有完整的注释来解释它的功能。下面是代码的工作原理:
$newrow = @{} # newrow contains the values on an output row at any given time
$newtable = [System.Collections.ArrayList]@() # newtable contains the final output
# Loop through each row in the input data, assign oldrow to the current row
foreach($oldrow in $data) {
# If the output row already has an ip, netmask or description, then start a new row (hashtable) and add the current row (hashtable) to output
if ($newrow[$oldrow.headers] -ne $null) {
Write-Host "$($oldrow.headers) Already found. Adding new row to output" -ForegroundColor Green
# Add the current row to the target object
[void]$newtable.Add($(New-Object PSObject -Property $newrow))
# Create a new empty row (hashtable)
$newrow = @{}
}
# For each iteration, keep adding data
Write-Host "Adding new entry for $($oldrow.headers)"
$newrow[$oldrow.headers] = $oldrow.data
}
# The final row is not added to the table within the loop, so it must be added here
Write-Host "Loop finished, adding final row to output" -ForegroundColor Green
[void]$newtable.Add($(New-Object PSObject -Property $newrow))
$newtable | select ip,netmask,description
假设
遇到具有相同标题值的记录时,需要一个新行。在此之前,应将记录添加到同一行,标题值提供新的列名
过程
Add()
方法写入主机
触发消息,添加旧行并设置新行。在foreach循环的第一次迭代中,由于hashtable为空,该值始终计算为false。
if
条件之外的块中,继续向哈希表添加值上一个答案没有使用问题中指定的数据,而这个答案使用了。它也有完整的注释来解释它的功能。下面是代码的工作原理:
$newrow = @{} # newrow contains the values on an output row at any given time
$newtable = [System.Collections.ArrayList]@() # newtable contains the final output
# Loop through each row in the input data, assign oldrow to the current row
foreach($oldrow in $data) {
# If the output row already has an ip, netmask or description, then start a new row (hashtable) and add the current row (hashtable) to output
if ($newrow[$oldrow.headers] -ne $null) {
Write-Host "$($oldrow.headers) Already found. Adding new row to output" -ForegroundColor Green
# Add the current row to the target object
[void]$newtable.Add($(New-Object PSObject -Property $newrow))
# Create a new empty row (hashtable)
$newrow = @{}
}
# For each iteration, keep adding data
Write-Host "Adding new entry for $($oldrow.headers)"
$newrow[$oldrow.headers] = $oldrow.data
}
# The final row is not added to the table within the loop, so it must be added here
Write-Host "Loop finished, adding final row to output" -ForegroundColor Green
[void]$newtable.Add($(New-Object PSObject -Property $newrow))
$newtable | select ip,netmask,description
假设
遇到具有相同标题值的记录时,需要一个新行。在此之前,应将记录添加到同一行,标题值提供新的列名
过程
Add()
方法写入主机
触发消息,添加旧行并设置新行。在foreach循环的第一次迭代中,由于hashtable为空,该值始终计算为false。
if
条件之外的块中,继续向哈希表添加值你用问题中提供的输入数据测试了吗?@mjsqu,没有。现在,我在我的Ubuntu笔记本电脑上。你用问题中提供的输入数据测试了吗?@mjsqu,没有。现在,我在我的Ubuntu笔记本电脑上。