【问题标题】:Powershell Array: HOWTO Dedup OutputPowershell 数组:HOWTO 去重输出
【发布时间】:2019-01-05 09:11:26
【问题描述】:

当我在我的contacts.xml 上运行这个解析器脚本时,每个用户显示一行,我得到了相同数据的多个实例。我只想要一个相同数据的条目。如何在数据写入 CSV 之前对其进行重复数据删除?

#https://stackoverflow.com/questions/29999682/powershell-parsing-a-text-file
$input = Get-Content $env:USERPROFILE\Downloads\contacts.xml\Downloads\contacts.xml
$array = @()
$input | % {
    $writeobj = $false
    $obj = New-Object System.Object
    if ($_ -match 'email*') {
        $Email = ($_ -split ':')[1]
    }
    if ($_ -match 'FN*') {
        $NAME = ($_ -split ':')[1]
        $writeobj = $true
    }
    if ($writeobj) {
        $obj | Add-Member -Type NoteProperty -Name Email -Value $Email
        $obj | Add-Member -Type NoteProperty -Name Name -Value $NAME
        $array += $obj
    }
    Write-Host $Name, $email
}
$array | Export-Csv -Path C:\scripts\reports\test.csv -NoTypeInformation

我希望这会产生单个条目,但我得到了重复项(而且它们也没有正确排列)。 (是的,我检查了 XML 文件中的单个条目)

【问题讨论】:

  • $Input var 名称是自动 $Var 名称之一...不要永远使用它。 [咧嘴]
  • 为什么不将内容转换为 [xml] 并检查属性/值?
  • $input 是一个automatic variable 并且不应该像那样重新使用。使用不同的变量名。
  • @PatrickBurwell - 那个变量 - $Input 是一个自动变量,除非您需要它的设计用途,否则不应使用它。否则,您会发现您的数据正在做奇怪的事情 ... [grin]

标签: arrays powershell duplicates


【解决方案1】:

Select 唯一对象。

$array |
    Select-Object -Property * -Unique |
    Export-Csv -Path 'C:\scripts\reports\test.csv' -NoType

作为旁注,您可能希望避免在循环中附加到数组,因为这势必会表现不佳。只需将您的ForEach-Object 循环直接输入Export-Csv

【讨论】:

  • @PatrickBurwell 试试Get-Content ... | % {...} | Select-Object ... | Export-Csv ...
  • 好的,我在“电子邮件”列的顶部收到一个回车,将所有内容都排掉...(我更改了电子邮件) 姓名 电子邮件 Scott SPACE Scott Scott@Christian.com Radhika Scott@ Christian.com Radhika radhika@consultinginc.com
  • 如果您的数据中某处有回车符导致格式混乱,您可以通过-replace '\r' 将其删除。
  • 这是顶部的第二列。不知道我会如何添加。 ;)
  • 我也不知道,因为你决定不透露你的数据,而我的水晶球在清洁工那里。
【解决方案2】:

我想通了。 我反转了 $obj Add-Member 变量*固定顺序)并在 FN 匹配中添加了另一个“$writeobj = $true”行,VOILÀ 没有更多的欺骗。 是不是很奇怪?

#https://stackoverflow.com/questions/29999682/powershell-parsing-a-text-file
$input = Get-Content $env:USERPROFILE\Downloads\contacts.xml $array =
@() $input | % {
    $writeobj = $false
    $obj = New-Object System.Object
    If ($_ -match 'email') {
        $Email = ($_ -split ':')[1]
        $writeobj = $true
    }
    If ($_ -match 'FN') {
        $NAME = ($_ -split ':')[1]
        $writeobj = $true # <-- right here
    }
    If ($writeobj){
        $obj | Add-Member -type NoteProperty -name Email -value **$NAME**
        $obj | Add-Member -type NoteProperty -name Name -value **$Email**
        $array += $obj
    }
    Write-Host $Name, $email } $array | Export-Csv -path C:\scripts\reports\test.csv -NoTypeInformation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2021-12-22
    • 2015-06-22
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多