如何解决如何使用Powershell将行转置为列
我将此输入作为数组名$ discrepancies。
Source Date Store Register Sales
XBR 8/1/2020 11741 517 1029.611
Xcenter 8/1/2020 11741 517 1047.701
XStore 8/1/2020 11741 517 1047.701
XBR 8/3/2020 11741 517 690.941
Xcenter 8/3/2020 11741 517 730.821
XStore 8/3/2020 11741 517 730.821
XBR 8/4/2020 11741 516 1027.311
Xcenter 8/4/2020 11741 516 1045.401
XStore 8/4/2020 11741 516 1045.401
XBR 8/7/2020 11741 516 688.641
Xcenter 8/7/2020 11741 516 728.521
XStore 8/7/2020 11741 516 728.521
我需要将数组转置到
Date Store Register XBR Xcenter XStore
8/1/2020 11741 517 1029.611 1047.701 1047.701
8/3/2020 11741 517 90.941 730.821 730.821
8/4/2020 11741 516 027.311 1045.401 1045.401
8/7/2020 11741 516 688.641 728.521 728.521
我尝试了下面的代码,但是如果数组只有一个寄存器,它就可以工作。
> $discrepancies= import-csv -Path "$OuputFile\discrepancies.csv"
>
> $pivot = @()
> foreach ($Date in $discrepancies.Date | Select -Unique)
> {
> $Props = [ordered]@{ Date = $Date }
> foreach ($Store in $discrepancies.Store | Select -Unique)
> {
> $Props += [ordered]@{ Store = $Store }
> foreach ($Register in $discrepancies.Register | Select -Unique)
> {
> $Props += [ordered]@{ Register = $Register }
> foreach ($Source in $discrepancies.Source | Select -Unique)
> {
> $Sales = ($discrepancies.where({ $_.Source -eq $Source -and
> $_.Date -eq $Date -and $_.Store -eq $Store -and $_.Register -eq $Register})).Sales
> $Props += @{ $Source = $Sales }
> }
> }
> }
> $pivot += New-Object -TypeName PSObject -Property $Props
> }
如果阵列中有多个寄存器,我收到几个“项目已添加。在字典中键入:”错误消息。我猜与将重复键插入字典有关的错误,但我不知道如何纠正。任何帮助将不胜感激。谢谢。
解决方法
让我们尝试将问题分解为两个独立的步骤:
- 基于日期,存储和注册的组差异
- 输出一个对象,该对象描述日期,存储,注册以及与该组关联的所有来源
第一步,我们可以使用Group-Object
:
$discrepancies |Group Store,Register,Date
现在我们已经正确地将输入分组了,我们可以继续构建输出了:
$discrepancies |Group Store,Date |ForEach-Object {
$entries = $_.Group
[pscustomobject]@{
Date = $entries[0].Date
Store = $entries[0].Store
Register = $entries[0].Register
XBR = ($entries |Where-Object Source -eq XBR).Sales
XCenter = ($entries |Where-Object Source -eq XCenter).Sales
XStore = ($entries |Where-Object Source -eq XStore).Sales
}
}
每个组中的所有条目必须具有相同的日期,存储和注册值(因为这是我们要求Group-Object
进行分组的值),因此对于那些条目,我们只复制组中第一个条目的值。
Mathias击败了我,自从完成工作以来,我觉得有义务发布它。与他的方法非常相似,但是在更大的数据集上他的速度可能更快。另外,请以后尝试提供实际的CSV示例。
$csvdata = @'
Source Date Store Register Sales
XBR 8/1/2020 11741 517 1029.611
Xcenter 8/1/2020 11741 517 1047.701
XStore 8/1/2020 11741 517 1047.701
XBR 8/3/2020 11741 517 690.941
Xcenter 8/3/2020 11741 517 730.821
XStore 8/3/2020 11741 517 730.821
XBR 8/4/2020 11741 516 1027.311
Xcenter 8/4/2020 11741 516 1045.401
XStore 8/4/2020 11741 516 1045.401
XBR 8/7/2020 11741 516 688.641
Xcenter 8/7/2020 11741 516 728.521
XStore 8/7/2020 11741 516 728.521
'@ -split "`n" -replace '\s+',',' | ConvertFrom-Csv
$csvdata | Group-Object -Property date -AsHashTable | foreach {
foreach($date in $_.keys)
{
$_.$date | Group-Object -Property source -AsHashTable |foreach {
[PSCustomObject]@{
Date = $date
Store = $_.values.store | select -first 1
Register = $_.values.register | select -first 1
XBR = $_['XBR'].sales
XCenter = $_['XCenter'].sales
XStore = $_['XStore'].sales
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。