如何在PowerShell中使用相同的标头合并两个csv文件并丢弃重复的行

时间:2016-07-13 02:03:47

标签: powershell

我正在从NetApp Performance Manager软件(OPM)收集性能计数器。 OPM在MySQL数据库中保存了30天的数据。所以我必须提出两个查询来检索数据:

  1. 每月30日首次查询并保存在csv文件中。
  2. 每月1日的第二次查询并保存在csv文件中。
  3. 然后合并两个csv文件以获取数据,如果一个月有31天。

    两个文件如下所示:

    "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但是它只给了一行。

3 个答案:

答案 0 :(得分:2)

Select -Unique实际上是正确的方法,你只需要多一点。哪个是-Property *或只是*

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

$csv1 = Import-Csv -Path ".\csv1.csv"
$csv2 = Import-Csv -Path ".\csv2.csv"

$merged = $csv1 + $csv2

$merged | Select -Property * -Unique

答案 1 :(得分:2)

至于为什么Select-Object -Unique无效

  • Select-Object -Unique ,当给定引用类型(字符串除外)的实例时,会比较它们的.ToString()值< / strong>以确定唯一性。

  • [pscustomobject]个实例,例如Import-Csv个创建的内容,令人遗憾的是从{{>>返回空字符串 1}}方法

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

S9uare's helpful Select-Object -Property * -Unique approach通过强制所有属性进行隐身比较来克服此问题,但附带性能警告
输入对象实际上是重新创建 ,并且在这种情况下比较所有属性值是过度的,因为比较.ToString()值就足够了;对于大输入文件,处理可能需要很长时间。

由于手头的数据来自CSV文件,使用Time而不是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的默认行为;根据需要改变。

对于作为字符串的输入对象,Export-Csv按预期工作 - 并且速度更快 但是请注意,对于大型输入文件,可能会耗尽内存,因为Select-Object -Unique需要构建包含所有行的内存数据结构以确定唯一性。

答案 2 :(得分:0)

让它完整的脚本运行它

#** ### 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}