Powershell:将多行合并为一行

Powershell: Merge multiple lines into one

我有一个 .csv 文件,它看起来像:

employeenumber;phone;mobile;fax;userid;Email
99999991;+1324569991;+234569991;+5234569991;user01;user1@domain.com
99999992;+1234569992;+234569992;;user02;user2@domain.com
99999993;+1234569993;+234569993;;user03;user3@domain.com
99999993;+12345699933;;;user03;user3@domain.com
99999993;;;+5234569993;user03;user3@domain.com
99999994;+1234569994;;;user04;user4@domain.com

如您所见,有不同的 employeenumbers 和一些具有相同 employeenumber 的行。

有没有办法在 powershell 中合并具有相同 employeenumber 的行?

类似的输出:

employeenumber;phone;mobile;fax;userid;Email
99999991;+1324569991;+234569991;+5234569991;user01;user1@domain.com
99999992;+1234569992;+234569992;;user2;user2@domain.com
99999993;+1234569993 / +12345699933;+234569993;+5234569993;user03;user3@domain.com
99999994;+1234569994;;;user04;user4@domain.com

谢谢

我试试看:

(@'
employeenumber;phone;mobile;fax;userid;Email
99999991;+1324569991;+234569991;+5234569991;user01;user1@domain.com
99999992;+1234569992;+234569992;;user02;user2@domain.com
99999993;+1234569993;+234569993;;user03;user3@domain.com
99999993;+12345699933;;;user03;user3@domain.com
99999993;;;+5234569993;user03;user3@domain.com
99999994;+1234569994;;;user04;user4@domain.com
'@).split("`n") |
foreach {$_.trim()} | sc test.csv

$ht = @{}
$props = (Get-Content test.csv -TotalCount 1).split(';')

import-csv test.csv -Delimiter ';' |
foreach {
 if ( $ht.ContainsKey($_.employeenumber) )
  {
    foreach ($prop in  $props )
     { 
       if ($_.$prop )
        {$ht[$_.employeenumber].$prop = $_.$prop }
     }
  }

  else { $ht[$_.employeenumber] = $_ }
 }

 $ht.values | sort employeenumber



employeenumber : 99999991
phone          : +1324569991
mobile         : +234569991
fax            : +5234569991
userid         : user01
Email          : user1@domain.com

employeenumber : 99999992
phone          : +1234569992
mobile         : +234569992
fax            : 
userid         : user02
Email          : user2@domain.com

employeenumber : 99999993
phone          : +12345699933
mobile         : +234569993
fax            : +5234569993
userid         : user03
Email          : user3@domain.com

employeenumber : 99999994
phone          : +1234569994
mobile         : 
fax            : 
userid         : user04
Email          : user4@domain.com

我试了一下。我相信我的回答比 Mjolinor 的更容易阅读。

我根据使用 Group-Object 命令将 CSV 中的条目分组为 $singletons 或 $duplicates。然后,我通过 $duplicates 管道并合并在 phone、移动或传真字段中找到的记录,使用您指定的“/”字符。

#$csv = get-content .\CSVNeedstoMerge.csv
$csvValues = $csv | ConvertFrom-Csv -Delimiter ';'
$duplicates = $csvValues | group-object EmployeeNumber | ? Count -gt 1
$objs = New-Object System.Collections.ArrayList

$singletons = $csvValues | group-object EmployeeNumber | ? Count -eq 1  | %     {$objs.Add($_.Group)}

ForEach ($duplicate in $duplicates){
$objs.Add([pscustomobject]@{employeenumber=($duplicate.Group.employeenumber  | select -Unique) -as [int];
    phone=($duplicate.Group.phone | ? Length -gt 0) -join '/';
    mobile=($duplicate.Group.mobile| ? Length -gt 0) -join '/';
    fax=($duplicate.Group.fax | ? Length -gt 0) -join '/';
    userid = $duplicate.Group.userid | select -Unique
    email= $duplicate.Group.email  | select -Unique })
}

$objs | Sort EmployeeNumber