我正在从 NetApp Performance Manager 软件 (OPM) 收集性能计数器。OPM 在 MySQL 数据库中保存了 30 天的数据。所以我必须发出两个查询来检索数据:
然后合并两个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,它只给出一行。
至于为什么Select-Object -Unique不起作用:
Select-Object -Unique,当给定引用类型(字符串除外)的实例时,比较它们的.ToString()值以确定唯一性。
[pscustomobject]实例(例如Import-Csv创建的实例)遗憾地从其方法中返回空字符串.ToString()。
因此,所有输入对象都比较相同的,并且仅返回第一个输入对象。
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需要构建包含所有行的内存中数据结构以确定唯一性。
| 归档时间: |
|
| 查看次数: |
15813 次 |
| 最近记录: |