如何在powershell中合并具有相同标题的两个csv文件并丢弃重复行

如何在powershell中合并具有相同标题的两个csv文件并丢弃重复行,powershell,Powershell,我正在从NetApp performance Manager软件(OPM)收集性能计数器。OPM在MySQL数据库中保存了30天的数据。因此,我必须放置两个查询来检索数据: 每月30日第一次查询并保存在csv文件中 每月1日第二次查询并保存在csv文件中 如果一个月有31天,则合并两个csv文件以获取数据 两个文件如下所示: "Time","objid","cpuBusy","cifsOps","avgLatency" "2016:06:04 00:04","72","50.6196","206

我正在从NetApp performance Manager软件(OPM)收集性能计数器。OPM在MySQL数据库中保存了30天的数据。因此,我必须放置两个查询来检索数据:

  • 每月30日第一次查询并保存在csv文件中
  • 每月1日第二次查询并保存在csv文件中
  • 如果一个月有31天,则合并两个csv文件以获取数据

    两个文件如下所示:

    "Time","objid","cpuBusy","cifsOps","avgLatency"
    "2016:06:04 00:04","72","50.6196","2069.11","7622.1"
    "2016:06:04 00:09","72","30.2233","2075.94","7633.27"
    "2016:06:04 00:14","72","35.2559","1980.64","8352.17"
    
    当我用下面的代码合并两个csv文件时。我从相同的数据/时间中获得重复的数据行

    @(Import-Csv au2004npsa003-mm-business.csv) + @(Import-Csv au2004npsa003-nn-business.csv) | export-csv joined.csv -NoTypeInformation
    
    如何合并两个csv文件而不获取重复数据?
    我已经尝试了
    select-unique
    ,但是它只给出了一行。

    完成了脚本,只需运行它

    #** ### Merged CSV to Unique
    
    
    #csv1
       # name,id, birth
      #John,007,1999
      #john,008,1999
      #john,709,1999
    
    
    #csv2
    
      # name,id, birth
      #John,006,1999
      #john,005,1999
      #john,709,1999
    
    #After Merged
    
      #John,007,1999
      #john,008,1999
      #**john,709,1999
      #John,006,1999
      #john,005,1999
    
    
      #  >>> Only one Unique Files exits john,709,1999
    
    
      ##### Just merge CSV example
    
    #csv1
       # name,id, birth
      #John,007,1999
      #john,008,1999
      #john,709,1999
    
      #csv2
      # name,id, birth
       #John,006,1999
      #john,005,1999
      #john,709,1999
    
    
      ## after Merged
    
       #name,id, birth
      #John,007,1999
      #john,008,1999
      #john,709,1999
      #John,006,1999
      #john,005,1999
      #john,709,1999
    
    
    
    
     ## Usage
    
    $csv1 = Import-Csv -Path "D:\CSV1.csv" #change the path to where csv one exists
    $csv2 = Import-Csv -Path "D:\CSV2.csv" #change the path to where other exists
    $UniQexpopath= 'D:\uniqueMerged.csv'  #change the path to where you want to export unique csv
    $expopath= 'D:\merged.csv' #change the path to where you want to export Merged csv
    
    
    
      Write-Host "Would you like to Unique Merge the CSV?"        -ForegroundColor Green 
    $Response = Read-Host "[Y] Yes, [N] No" 
        If($Response -eq "y") 
    {write-host "Merging Csv please wait" -foregroundcolor Red
    
    $merged | Select -Property * -Unique | Export-csv -path $UniQexpopath -NoTypeInformation 
    write-host "Merging completed please check $UniQexpopath" -foregroundcolor Green}
    
    
      else{ write-host "Merging Csv please wait" -foregroundcolor Red
      $merged = $csv1 + $csv2
    
    $merged | Export-csv -path $expopath -NoTypeInformation
    write-host "Merging completed please check $expopath" -foregroundcolor Green}
    

    Select-Unique
    实际上是正确的方法,您只需要多一点。这是
    -Property*
    还是简单的
    *

    由于
    Select-Unique
    不会自动比较所有属性,因此需要指定
    *
    ,以便它比较整个对象

    $csv1 = Import-Csv -Path ".\csv1.csv"
    $csv2 = Import-Csv -Path ".\csv2.csv"
    
    $merged = $csv1 + $csv2
    
    $merged | Select -Property * -Unique
    

    至于为什么
    选择对象-唯一
    不起作用

    • 选择对象-唯一性
      ,当给定引用类型(字符串除外)的实例时,比较它们的
      .ToString()
      ,以确定唯一性

    • [pscustomobject]
      实例
      ,例如
      导入Csv
      创建的实例,遗憾的是从它们的
      .ToString()
      方法返回空字符串

    因此,所有输入对象比较相同的,并且只返回第一个输入对象

    通过强制对所有属性进行内部比较来克服此问题,但附带了一个性能警告:
    输入对象被有效地重新创建,在这种情况下,比较所有属性值是过分的,因为比较
    时间
    值就足够了;对于大型输入文件,处理可能需要很长时间


    由于手头的数据来自CSV文件,性能问题可以通过使用
    Get Content
    而不是
    Import CSV
    进行字符串处理来解决:

    Get-Content au2004npsa003-mm-business.csv, au2004npsa003-nn-business.csv |
      Select-Object -Unique |
        Set-Content -Encoding ASCII joined.csv
    
    请注意,我正在使用
    -Encoding ASCII
    模拟
    导出Csv
    的默认行为;根据需要改变

    对于字符串输入对象,
    Select Object-Unique
    按预期工作,速度更快。

    但是,请注意,对于的大型输入文件,您可能会耗尽内存,因为
    选择对象
    需要建立一个包含所有行的内存中数据结构,以确定唯一性。

    通过s9suare尝试该脚本,它可以工作添加导出csv复制下面的脚本
    $csv1=Import csv-路径“D:\csv1.csv”$csv2=Import Csv-Path“D:\csv2.Csv”$merged=$csv1+$csv2$merged | Select-Property*-Unique | Export Csv-Path D:\merged.Csv-NoTypeInformation
    这非常简单,但附带了一个性能警告:输入对象将有效地重新创建,并且您必须始终比较所有属性值,即使比较
    “时间”
    值就足够了;对于大型输入文件,处理可能需要很长时间。诡辩:在这种情况下不是问题,但通常使用
    @($csv1)+$csv2
    来处理
    $csv1
    恰好只包含一个对象的情况更安全。(为了降低内存使用量,也可以考虑通过管道直接发送对象:<代码>导入CSV.\CSV1.CSV,\cv2.2.CSV,选择-属性*-唯一的< /代码>)