powershell 比较Excel文件内容

今天在工作中遇到一个问题,需要比较Excel文件中两列值有哪些不同:

1ab12ecdac92a87f52ef7fda00021cc4e8b.jpg

实际上这两列数据比较多且大多数重复,上图只是举个简单的例子,

可以看出其中345是重复项,怎么找出来呢?用powershell实现如下:

$t = New-Object -ComObject excel.application #先定义一个Excel对象

#$t.visible = $true #默认为false,excel会在后台执行

$ex = $t.workbooks.open("C:\Users\v-zhp\Downloads\Compare files.xlsx") #打开excel

$sheet = $ex.sheets.item(1) #定义sheet

$a = $sheet.Columns().item(1) #取第一列

$objectA=New-Object -TypeName System.Collections.ArrayList #定义一个数组用于存放列值

#$objectA=@() 这是最简单的数组定义方法但是效率比较低,所以抛弃

for($i=1;$i -le ($a.range("a65536").end(-4162).row);$i++) #a65536是最大行数,-4162意思是向上,VBA中意为从底向上找第一行非空的行标

{$ar=$a.range("A$i").text.Trim()
$arr=$ar.Substring($ar.LastIndexOf('\')+1)
$objectA.Add($arr) | Out-Null
#$objectA+=$arr
}#数据清洗,只取有效部分,Out-Null表示禁止显式输出,不加这个会导致对象写入管道,就是会打印出来数组的角标

$objectA=$objectA | Sort-Object -Unique #排序去重

Write-Host *********************** 分割线,下面取第二列,原理同上***********************-ForegroundColor Yellow

$b = $sheet.Columns().item(2)

$objectB=New-Object -TypeName System.Collections.ArrayList
#$objectB=@()

for($j=1;$j -le $b.range("a65536").end(-4162).row;$j++)

{$br=$b.range("A$j").text.Trim()
$brr=$br.Substring($br.LastIndexOf('\')+1)
$objectB.Add($brr) | Out-Null
#$objectB+=$brr
}

$objectB=$objectB | Sort-Object -Unique

diff $objectA $objectB -IncludeEqual | where{$_.SideIndicator -ne "=="}

#用diff比较两个数组,得到不同的内容

$ex.Close()
$t.Application.Quit()

#关闭应用

运行结果如下:

b7adcd2d21ebe0926ff7ce9709e8cd4f0c8.jpg

 

 

 

转载于:https://my.oschina.net/qiuSHENv587/blog/3063038

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值