軟體工程師在工作上常常會需要在資料庫中insert大量資料,
像是準備測試資料、資料轉置、BUG重現…等等的情境。
如果能夠直接使用工具或是DB的Restore去處理再好不過,但通常都不會這麼方便,
我的經驗,最常遇到的狀況都是要把文字檔或是Excel的資料匯入資料庫,
如果有閒的話可以寫一個小程式去處理,常常這種狀況都是營運環境的系統出現問題了,
在時間壓力下,直接寫SQL去insert是最快的辦法。
剛才最近在做一個有關樂透選號的系統,剛好可以分享一下這個小技巧給不知道的朋友。
首先,我們有一個TABLE長這個樣子。

需要把網路上下載的歷史開獎號word檔寫到Table

要怎麼快速把這個清單轉換成我們要的格式並且寫好SQL呢?
這邊會用到Excel和比較進階的文字編輯器(如UltraEdit、Notepad ++)。
雖然這是一個非常簡單的需求,首先還是一定要進行評估,我們先看一下目標的Table各欄位的格式

然後看一下我們來源的文字檔,簡單分析一下我們應該要做哪些事情
- 處理開獎期號和開獎號-將文字檔的年份及期號合併且中間補0,開獎號個位數補0
- 處理日期-加上源數據少的年份並且把月日的格式改成mm-dd
- 寫SQL-一次寫入所有資料
接下來逐一擊破。
1. 處理開獎期號和開獎號
將數字依一定的長度補0,這個有很多工具可以做到,我用過最方便的是用Microsoft的Excel,
先將文字檔的資料貼到Excel簡單整理一下,留下我們需要的部分。

像是期別的格式前三碼是民國年112加上前面補0的6碼數字

補0的部分只要在儲存格格式中選自訂,類型輸入000000就可以了。
獎號的部分比照辦理,類型00。

結果如下圖綠色欄位。

2.加入年份
先Excel插入兩個欄位把年份填進去,
然後用上面的方法把月日的格式改成兩碼前補0。
結果如下圖藍色欄位。

3.寫SQL
最後我們利用UltraEdit的垂直編輯功能一次將所有的資料寫到同一段insert裡面。
1. 先把insert sql的開頭和結尾寫好。

2. 然後把先前整理的excel期號相關的兩個欄位貼到UltraEdit中。

3. 切換到區塊模式。

4. 這時就可以使用垂直編輯的方式把中間的空格刪掉。

5. 再垂直編輯把SQL語法需要的括號、逗點、單引號加上去。

6. 接下來把日期三個欄位貼過來。

7. 一樣用垂直編輯的方式把日期中間的-加進去。

8. 同樣的操作把整個Table的資料貼到UltraEdit中。

9. 注意一下,如果最後有逗點的話要刪掉。

10. 這樣SQL就寫好了,看一下實際跑完的結果。

其實這種垂直編輯的技巧可以應用在很多地方,
不單純只是寫SQL,有時遇到要寫大量重複程式碼的時候也可以用。
工作的時候常常會使用各種不同工具去解決問題,雖然乍看之下會有點不倫不類,
但我的習慣就是手邊什麼順手就用什麼,只有能夠把問題拆的夠細,針對每個細節再去使用適合的工具。
能解決問題才是最重要的。