首页 > 解决方案 > 结合不同的列powershell

问题描述

我需要结合这种格式的 csv 条目:

ID, "Name", "Sex",  "Age"
1, "John", "m", "24"
2, "John", "m", "28"
2, "John", "m", "30"
3, "Melissa", "f", "24"
3, "Melissa", "f", "26"

到:

ID, "Name", "Sex", "Age", "Age" ,"Age"
1, "John", "m", "24", "28", "30"
3, "Melissa", "f", "24", "26"

到目前为止我得到了什么:

$csvData = Import-Csv 'test.csv'
$csvData | Group-Object "ID" | ForEach-Object {
    [PsCustomObject]@{
        "ID" = $_.Name
        "Sex" = $_.Group."Sex" -join '","'
        "Age" = $_.Group."Age" -join '","'
    }
} | Export-Csv 'test_output.csv' -NoTypeInformation

它返回给我这个:

"ID","Name", "Sex", "Age"
"1", "John", "John", "John", "m", "m", "m", "24", "28", "30"
"2", "Melissa", "Melissa", , "f", "f", "24", "26"

我该如何解决这个问题?

标签: powershellcsvduplicates

解决方案


如果我理解正确,那么这只是一个 PowerShell foo 中的练习,而不是有意义的数据操作。

在此前提下:创建所需输出(并最终得到有效 csv)的一种方法是为要包含在合并对象中的每个“年龄”值添加编号属性。

$csvData = Import-Csv 'test.csv'
$csvData | Group-Object Name | ForEach-Object {

    $obj = [ordered]@{
        ID = $_.Group[0].ID
        Name = $_.Name 
        Sex = $_.Group[0].Sex
    }
    for ($i = 0; $i -lt $_.Group.Count; $i++) {

        $obj["Age$($i+1)"] = $_.Group[$i].Age
    }
    [PsCustomObject]$obj
} | Export-Csv 'test_output.csv' -NoTypeInformation

推荐阅读