當前位置:
首頁 > 最新 > Windows PowerShell進階比較2個csv的差異

Windows PowerShell進階比較2個csv的差異

終於又有時間更新了,這一周真是忙的要死,科目一順利通過(^▽^)。今天講下我工作當中用到的一個需求:比較2個csv的不同。背景是每次對資料庫的改動前後抓取資料庫的snapshot,然後對比前後2次snapshot的異同是否和我們實際做的操作一致。

所以假使我們有如下2個csv,我們需要比較他們之間的不同:

25-old_new_csv_content

最後希望看到的結果如下:

user "alex" has role "upload" in old csv, but only has role "delete" in new csv, so the result should be"user "alex" has been revoked role "upload" and granted role "delete""

user "tom" has same role in old & new csv, so there is no difference,hence no data in compare result report

do same action on user "tom" as user "alex"

25-compare result

Compare-Object

powershell自帶了一個cmdletsCompare-Object,就是用來比較2個對象的異同。一般使用如下,詳細使用方法相信大家應該知道怎麼查詢了。

簡單解釋下怎麼看這個結果:

=>: 當前對象(這個例子里是:6和7)在DifferenceObject(@(3..7)),卻不在 ReferenceObject(@(1..5))

Select-Object

select-object之前我們也有提到過,可以對管道傳來的對象進項篩選:

select 比較強大的一點是可以用哈希表自定義過濾條件,自定義的哈希表用如下格式:

@}

$name: 表頭名字

$expression: 對應顯示的值,可以看到其是在scriptblock裡面的

分析


其中[io.path]::GetExtension($_)是.NET的方法,為獲取文件的後綴名

2. 要用到的基本函數

New-Shortcut用到的是調用vbscript的功能,這裡大家先知道這麼用,以後會詳細講解

[string]::IsNullOrWhiteSpace($error_info )是.NET的方法,用來判斷一個string是否為null或者只有空白字元。

3. 現在我們已經有了2個csv file,在正式比較之前我們需要初始化一下變數和預處理:

如果用戶沒有提供compare_path,那麼我們就在當前目錄創建一個名為compare的子目錄存放結果。

在確定了compare path之後我們用舊的csv加上新的csv名字作為最終compare result csv name

如果compare result csv已經存在或者新舊csv名字相同,那麼我們都退出腳本,不再繼續執行下去

接下來獲取各個csv的表頭(上一篇講過),如果表頭不一致(名字,個數和順序都相同才為一致),則退出腳本

在compare folder下創建原始csv的快捷方式,這樣不用把原始文件copy過來,節省磁碟空間。

比較

目標結果如下:

我們直接按照剛才上面所說的比較的話會沒有任何內容顯示出來

針對csv的比較,我們需要提供比較的屬性,也就是表頭。

可以看到結果了,但是離最終的樣式還有一段距離,接下來我們需要用到select-object來調整樣式

我們看到效果已經是和我們需要的一樣了,但是這就結束了嗎,細心的小夥伴可能已經發現了,這裡select篩選的時候我們寫死了User,role,但是顯然不可能每次比較csv的時候都是同樣的表頭,那像下面這樣用變數$old_header呢?

很不幸,這樣居然不行,這裡我們需要將自定義的哈希表保存到一個數組然後再和後面的表頭數組組合成一個完整數組

保存哈希表到數組: @(@else{"Revoke"}}})

和表頭數組組合成一個完整數組: (@(@else{"Revoke"}}})+$old_header)

然後再執行select篩選:

OK,是我們想要的結果,而且這次我們用了表頭變數,所以針對任何形式的csv都可以這樣比較了,那麼保存比較結果到csv中:

驗證腳本的完整功能性

相同名字

表頭不對

正常比較和比較的結果

再次比較相同csv

OK, 跑一遍可以解決我們預期遇到的各種問題,完整腳本和csv file在我的碼雲上https://gitee.com/chaoyuew/powershell/tree/feature/wechat/SPPS25,預計下一篇講合併多個csv文件。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

2000多萬的人工智慧數據中心都有些啥設備?
後來的我們,你們都去哪了?

TAG:全球大搜羅 |