Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel powershell转置并仅保留一组标头_Excel_Powershell - Fatal编程技术网

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
假设 遇到具有相同标题值的记录时,需要一个新行。在此之前,应将记录添加到同一行,标题值提供新的列名

过程
  • 设置一个名为$newrow的哈希表
  • 设置名为$newtable的ArrayList。ArrayList比标准数组更灵活,因为它们有一个
    Add()
    方法
  • 使用foreach循环遍历数据
  • 从一个if语句开始,该语句处理如何查找包含已分配列的记录。此时,使用
    写入主机
    触发消息,添加旧行并设置新行。在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
    
    假设 遇到具有相同标题值的记录时,需要一个新行。在此之前,应将记录添加到同一行,标题值提供新的列名

    过程
  • 设置一个名为$newrow的哈希表
  • 设置名为$newtable的ArrayList。ArrayList比标准数组更灵活,因为它们有一个
    Add()
    方法
  • 使用foreach循环遍历数据
  • 从一个if语句开始,该语句处理如何查找包含已分配列的记录。此时,使用
    写入主机
    触发消息,添加旧行并设置新行。在foreach循环的第一次迭代中,由于hashtable为空,该值始终计算为false。
  • if
    条件之外的块中,继续向哈希表添加值
  • 最后,添加最后一行,然后使用“选择对象”按正确顺序打印输出

  • 你用问题中提供的输入数据测试了吗?@mjsqu,没有。现在,我在我的Ubuntu笔记本电脑上。你用问题中提供的输入数据测试了吗?@mjsqu,没有。现在,我在我的Ubuntu笔记本电脑上。