我正在从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"
当我用下面的代码合并两个csv文件时。我得到了来自相同数据/时间的数据的重复行。
@(Import-Csv au2004npsa003-mm-business.csv) + @(Import-Csv au2004npsa003-nn-business.csv) | export-csv joined.csv -NoTypeInformation
如何在不获取重复数据的情况下合并两个csv文件?
我试过了select -unique
但是它只给了一行。
答案 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}