程序員必須知道的幾個Excel技巧——批量生成sql腳本

說明

有時候我們在維護數據庫時,需要編寫SQL腳本批量導入數據庫(尤其是在項目上線初期),比如業務給了一個Excel文檔(成千上萬條數據的那種),要你導入數據庫,當然你可以通過寫代碼來讀取Excel文檔進行導入,不過這種需求可能是一次性的,用一次後面就不用了,寫代碼成本太高。因此直接通過Excel函數來生成腳本更省事。

幾個常用的Excel函數

  1. IF()函數
    該函數使用方式和MySQL中的if()函數一樣,可以嵌套使用。
    IF(<條件表達式>, <滿足條件後的返回值>, <不滿足條件的返回值>)

  2. SUBSTITUTE()函數
    字符串替換函數,返回替換後的值。
    SUBSTITUTE(<原始字符串>,<被替換的字符>,<替換後的字符>)

  3. CLEAN()函數
    清空不可見字符。
    如回車、換行、TAB鍵、不可見的雙引號等。
    由於Excel複製單元格時,如果單元格內容是字符類型,則會複製後再粘貼到文本文檔中會自動添加雙引號,可以通過這個函數去掉雙引號。

  4. TRIM()函數
    去空格函數

  5. 幾個特殊符號
    & 字符串拼接符號,如:A1&“hello你好”, A1是一個單元格引用。
    $ 絕對定位符號,$A1,$A$1。 使用絕對定位符後,在做Excel拖拉複製操作時單元格的引用不會隨位置變化而變化。

批量生成SQL腳本

  1. 先寫一個sql示例模板,這裏的 @field_name 、@field_value 、@pkg_id 、@seq 是佔位符,需要替換的。
update t_test 
set @field_name='@field_value'
WHERE package_id=@pkg_id and sequence = @seq
;
  1. 準備如下Excel
    excel截圖

A1單元格:輸入固定值5,用於替換佔位符@pkg_id,當然這個值是需要根據具體需求修改的。
B1單元格:輸入上面的SQL模板。

我們要處理的數據是從第3行開始:
E3單元格:=IF(CLEAN(TRIM(B3))="模式識別能力","recognition_ability",IF(CLEAN(TRIM(B3))="抽象思維能力","abstract_ability","")) 根據B3單元格的值獲取更新的字段名。
F3單元格:=SUBSTITUTE($B$1,"@field_name",E3) B1爲sql模板,該函數替換模板中的@field_name爲E3中計算出來的字段名,由於B1是固定的因此用絕對引用$B$1。
G3單元格:=SUBSTITUTE(F3,"@field_value",C3) 替換sql模板中的@field_value爲C3的值。
H3單元格:=SUBSTITUTE(G3,"@pkg_id",$A$1) 替換sql模板中的@pkg_id爲A1的值,由於A1是固定的,因此用絕對引用$A$1。
I3單元格:=SUBSTITUTE(H3,"@seq",D3) 替換sql模板中的@seq爲D3的值。
J3單元格:=CLEAN(I3) 清空I3單元格值中的不可見字符得到最終結果。

I3計算後的值如下:

"update course_lesson  
set recognition_ability='excel測試內容001' 
WHERE package_id=5 and `sequence` = 4 
;"

J3計算後的值如下:(已經去掉了回車、最外層的雙引號等字符)

update course_lesson  set recognition_ability='excel測試內容001' WHERE package_id=5 and `sequence` = 4 ;
  1. 要批量生成後面的sql,只需選中需要複製的區域,然後將表格往下拉去自動填充即可。
    Excel批量複製
    如果有成千上萬行數據你可不能這麼往下拉,那要拉到何年何月去,你可以用快捷鍵:
    (1)首先選中要填充的區域:如用選中E3單元格,然後按住shift鍵不鬆開,再點擊J100,最後鬆開shift鍵,這樣從E3到J100對角線的整個方形區域就被選中了(或者直接按 ctrl + shift + 下箭頭 從當前選擇的區域到Excel最後一行全部選中)。
    (2)然後自動填充所選區域ctrl + d
    如果是Mac,將ctrl換成command即可

  2. 最後將【最終結果】這一列全部複製,粘貼到文本格式中即可

update course_lesson  set recognition_ability='excel測試內容001' WHERE  package_id=5 and `sequence` = 4 ;
update course_lesson  set abstract_ability='excel測試內容002' WHERE package_id=5 and `sequence` = 4 ;
update course_lesson  set abstract_ability='excel測試內容003' WHERE package_id=5 and `sequence` = 5 ;
update course_lesson  set recognition_ability='excel測試內容004' WHERE package_id=5 and `sequence` = 5 ;
update course_lesson  set recognition_ability='excel測試內容006' WHERE package_id=5 and `sequence` = 6 ;
update course_lesson  set recognition_ability='excel測試內容007' WHERE package_id=5 and `sequence` = 7 ;
update course_lesson  set abstract_ability='excel測試內容008' WHERE package_id=5 and `sequence` = 7 ;

當然你也可以不使用sql模板佔位符的方式,直接用&符號將sql片段拼接起來,
但是如果sql太長你會頭暈的。 拼接示例如下:

="update t_test set "&IF(CLEAN(TRIM(B3))="模式識別能力","recognition_ability",IF(CLEAN(TRIM(B3))="抽象思維能力","abstract_ability",""))&"='"&C3&"' WHERE package_id="&$A$1&" and sequence = "&D3&";"  

真實的業務數據格式遠比這個示例要複雜,但是你可以通過這種方法進行擴展基本都能實現,實在不行就只能使出程序員的殺手鐗了——show me the code。













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章