2013年10月31日

用 unoconv 轉出我的 .xlsx 資料

典型的應用程式開發多會處理資料庫(RDB)。
有很多情形是版本會依不同的開發環境不同而資料庫也有所不同,例如:
  • Dev. App sever --> Dev. DB server
  • UAT App server --> UAT DB server
對於 Dev. DB server 上的資料,無論是測試案例或設定資料會不斷、不斷的異動;或者像 UAT DB server 上的資料會從不同的測試 phase 往前或往後進、退版時而所有異動。

App 前後版本的異同有很多開發工具可用而能看出差異,但對於要觀察或審視因此而調整的差異資料,要如何比對出來呢?

這個問題對於精熟資料庫及工具的 DBA 來說,也許不是什麼大問題;要模擬前後不同的(資料庫中)測試案例或設定資料,無論是觀察或資料補遺,免不了要進行資料兩相比對,這種情形可能來說,但對於應用程開發人員來說會是不小的困擾。

以個人而言,以  Unix 為作業平台使然,會第一時間聯想到很多 command 來操作文字型態的資料差異,例如:diff。再者,很多資料庫相關的工具有很多匯出的功能,例如 SQL Developer 能匯出 .csv 檔案。如此來說,可以用 diff 指令比對不同時點或不同資料庫同一 Table 資料的匯出檔,即可分辨其差異。

但,個人也遇過有些開發或資料管理人員喜歡使用 Excel 來進行資料統整;若遇上要用此來做為資料比對的對像,又要如何呢?

直觀上,就是使用 Excel 來轉存 .csv 檔案即可。

但幾種情形可能不見得適用:
  • 沒有 license 供安裝 Excel
  • 要大量、批次比對 (這裡指的對像是 Tables)
  • 非 Unix / Linux 平台使用者 (意指 command line 型式)
想到的方法是 OpenOffice/LibreOffice,以 command line 方式匯出,供 diff 指令來進行比對,然後以 shell script 型式存在,就可以進行批次、自動化作業。(當然,也有人會用 VBS 對 Excel 調用 API 來做,再用排程來進行此一作業)

使用 OpenOffice/LibreOffice 時可借助 unoconv (python code) 來做,可省去很多寫 script 的時間。做法:
  • 安裝 OpenOffice/LibreOffice (通常 python 是預裝好的,若否也要安裝)
  • 設定 PATH,確定能執行到 python、OpenOffice/LibreOffice、unoconv
  • 分別匯出欲比對的兩個 .xlsl 檔案成 .csv 檔案
    unoconv -f csv myTableVer1.xlsx
    unoconv -f csv myTableVer2.xlsx
    
  • 儲存比對的結果
    diff myTableVer1.csv myTableVer2.csv > myTable.diff
    cat myTable.diff | colordiff | less -R
that's it.

沒有留言: