如何在powershell中合并具有相同标题的两个csv文件并丢弃重复行
我正在从NetApp performance Manager软件(OPM)收集性能计数器。OPM在MySQL数据库中保存了30天的数据。因此,我必须放置两个查询来检索数据:如何在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
"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,选择-属性*-唯一的< /代码>)