【问题标题】:Dynamically enumerate object from vertical to horizontal从垂直到水平动态枚举对象
【发布时间】:2018-10-14 16:53:55
【问题描述】:

我已经使用 PowerShell 将数据转换为如下对象,现在我想将其从垂直转换为水平。 (如 Excel 中的“文本到列”功能)。如何动态枚举“所有第 1 行”作为对象标题,其余的将分配给其子项?

输入文件在 PSObject 中包含“行”、“列”和“文本”三列

PS > $表 行列文本 --- ------ ---- 1 1 部门 1 2 时间 1 3 天1 1 4 天2 1 5 天3 1 6 天 4 1 7 天5 1 8 天6 1 9 天 7 2 1 营销 2 2 11:00 2 3 4 2 4 8 2 5 8 2 6 8 2 7 4 2 8 0 2 9 0 3 1 财务 3 2 09:00 3 3 4 3 4 8 3 5 8 3 6 8 3 7 4 3 8 0 3 9 0

我尝试使用下面的代码将它分配给另一个对象,但我不知道如何让内容放入。

$data = New-Object –TypeName PSObject

$table | %{
    if ($_.row -eq 1) {
        $data | Add-Member –MemberType NoteProperty –Name $_.text –Value ''
    } 
}

输出:

PS > $data|ft

Dept Time Day1 Day2 Day3 Day4 Day5 Day6 Day7
---- ---- ---- ---- ---- ---- ---- ---- ----

预期结果:

部门时间 Day1 Day2 Day3 Day4 Day5 Day6 Day7 ---- ---- ---- ---- ---- ---- ---- ---- ---- 营销 11:00 4 8 8 8 4 0 0 财务 09:00 4 8 8 8 4 0 0

【问题讨论】:

  • Sury.C - 你真的有一个包含 3 列名为 Row/Column/Text 的 CSV 吗?还是您有一个包含一列的文件 - 您命名为 Text 的文件?
  • SO 不是免费的代码编写服务。到目前为止,您尝试了什么(显示您的代码),您需要帮助解决什么具体问题(在您的代码中)?
  • 对不起,我再补充一些信息

标签: powershell


【解决方案1】:

需要某种间接引用。您可以执行以下操作:

$dataLabels = New-Object –TypeName psobject
$dataZero   = New-Object –TypeName psobject
$data       = @()        ### or ### New-Object System.Collections.ArrayList
$table | Where-Object { $_.row -eq 1 } | ForEach-Object {
    $dataLabels | 
      Add-Member –MemberType NoteProperty –Name $_.Column –Value $_.Text
    $dataZero | 
      Add-Member –MemberType NoteProperty –Name $_.Text   –Value ''
  }
$dataZeroCsv = $dataZero | ConvertTo-Csv -NoTypeInformation
for ( $i=0;$i -lt ($Table.Row|Measure-Object -Maximum).Maximum -1;$i++)
{
    $dataLine = $dataZeroCsv | ConvertFrom-Csv
    $table | Where-Object { ($_.Row - 2) -eq $i } | 
        ForEach-Object {
           $dataLine.($dataLabels.($_.Column)) = $_.Text ### indirect reference
        }
    $data += $dataLine   ### or ### [void]$data.Add( $dataLine )
}

## Output:
$data | Format-Table

前提是$table定义如下:

$tableArr = @"
Row Column Text
  1      1 Dept
  1      2 Time
  1      3 Day1
  1      4 Day2
  1      5 Day3
  1      6 Day4
  1      7 Day5
  1      8 Day6
  1      9 Day7
  2      1 Marketing
  2      2 11:00
  2      3 4
  2      4 8
  2      5 8
  2      6 8
  2      7 4
  2      8 0
  2      9 0
  3      1 Finance
  3      2 09:00
  3      3 3
  3      4 4
  3      5 5
  3      6 6
  3      7 7
  3      8 0
  3      9 1
  4      1 TestDept
  4      2 16:00
  4      4 5
"@  -split [System.Environment]::NewLine
$table = $tableArr -replace '\s+', ' ' -replace '^\s', '' | 
            ConvertFrom-Csv -Delimiter ' '

输出

PS D:\PShell> D:\PShell\SO\52804963.ps1

Dept      Time  Day1 Day2 Day3 Day4 Day5 Day6 Day7
----      ----  ---- ---- ---- ---- ---- ---- ----
Marketing 11:00 4    8    8    8    4    0    0
Finance   09:00 3    4    5    6    7    0    1
TestDept  16:00      5

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2021-11-13
    • 1970-01-01
    • 2010-09-30
    • 2016-10-07
    • 2012-10-10
    • 2013-10-07
    • 2018-02-08
    相关资源
    最近更新 更多