今天在工作中遇到一个问题,需要比较Excel文件中两列值有哪些不同:
实际上这两列数据比较多且大多数重复,上图只是举个简单的例子,
可以看出其中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()
#关闭应用
运行结果如下: