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

Nit*_*ish 4 powershell

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

  1. 每月 30 日首次查询并保存在 csv 文件中。
  2. 每月 1 日第二次查询并保存在 csv 文件中。

然后合并两个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"
Run Code Online (Sandbox Code Playgroud)

当我用下面的代码合并两个 csv 文件时。我得到了包含来自相同数据/时间的数据的重复行。

@(Import-Csv au2004npsa003-mm-business.csv) + @(Import-Csv au2004npsa003-nn-business.csv) | export-csv joined.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)

如何合并两个 csv 文件而不获取重复数据?但是我尝试过select -unique,它只给出一行。

mkl*_*nt0 7

至于为什么Select-Object -Unique不起作用

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

  • [pscustomobject]实例(例如Import-Csv创建的实例)遗憾地从其方法中返回空字符串.ToString()

    • 这个长期存在的错误在 PowerShell (Core) 7.2 中仍然存在,最初是在GitHub 问题 #6163中报告的。

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

S9uare 的有用Select-Object -Property * -Unique方法通过强制单独比较所有属性来克服这个问题,但也带来了性能警告
输入对象被有效地重新创建,并且在这种情况下比较所有属性值是多余的,因为比较Time值就足够了;对于较大的输入文件,处理可能需要很长时间。


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

Get-Content au2004npsa003-mm-business.csv, au2004npsa003-nn-business.csv |
  Select-Object -Unique |
    Set-Content -Encoding ASCII joined.csv
Run Code Online (Sandbox Code Playgroud)

请注意,我正在用来-Encoding ASCII模仿 的Export-Csv默认行为;根据需要进行更改。

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