从csv中删除重复项,但仅删除具有唯一值的重复项

slsn1g29  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(93)

我有一个CSV,其中包含以下内容

"STAFF_STATUS","SFKEY","FIRST_NAME","SURNAME","E_MAIL"
"ACTV,"JON1,"JOHN","DOE","[email protected]
"LEFT","JAN1","JANE,"DOE,"[email protected]
"ACTV","STE1,"STEVE,"BEEV",[email protected]
"ACTV,"JON5",JOHN","DOE","[email protected]

我想删除csv中的重复行,但只删除STAFF_STATUS中带有“LEFT”的重复行
我用过下面的powershell,但发现它的准确率约为70%,有时会留下一个“左”重复,并删除“ACTV”重复

$csv1 = '\\Server\c$\Folder\CSVData.csv
$csv1a  = Import-Csv $csv1
$csv1b = $csv1a | Sort-Object -Property SURNAME,First_Name -unique
$csv1b | Export-Csv -Path "\\Server\c$\Folder\CSVData(2).csv" -NoTypeInformation

如果我把第三个属性放在sort对象中,它不会删除任何重复的属性。我已经尝试了其他方法,包括一些尝试从聊天,但没有工作,上述是接近我可以得到,但我需要100%的准确性。

xdyibdwo

xdyibdwo1#

我从Sort-Object命令中推断出,您认为具有相同姓氏和名字的行是重复的。
如果是这样,您可以使用Group-Object按共享的姓氏和名字分组,并从每个组中删除状态列中包含LEFT的行(如果有的话):

$csv1a | 
  Group-Object -Property SURNAME,First_Name |
  ForEach-Object { 
    if ($_.Count -gt 1) {
      # A duplicate set, filter out the "LEFT" status rows.
      $_.Group | Where-Object STAFF_STATUS -ne LEFT
    } else {
      # Not part of a duplicate set, pass through.
      $_.Group
    } 
  } |
  Export-Csv -Path "\\Server\c$\Folder\CSVData(2).csv" -NoTypeInformation

注意事项:

  • if ($_.Count -gt 1)确保只删除LEFT行 * 和重复行 *;如果您还希望在这些行 * 孤立地 * 出现时删除它们,请删除此条件和else分支,或者更有效地,因为这相当于 * 无条件地 * 删除LEFT行-省略ForEach-Object调用并直接通过管道连接到

Where-Object STAFF_STATUS -ne LEFT

  • E_MAIL列分组可能是查找重复项的更好方法。

相关问题