VimScript自定義命令將Excel表格導出數(shù)據(jù)轉為sql腳本

需求說明

有時候,經(jīng)常需要將excel表格中數(shù)據(jù),轉化成sql,方便在數(shù)據(jù)庫中進行靈活的查詢。
比如,如下是從excel表格中復制出的數(shù)據(jù):

NAME    AGE RANK
paopao  5   6
kobe    45  1
tim 36  2
park    35  4
james   35  7
westbrook   32  99

如果將其轉化成sql腳本,放到數(shù)據(jù)庫中,就可以方便地進行查詢:

-- NAME AGE RANK
select 'paopao' NAME, '5' AGE, '6' RANK from dual union all
select 'kobe' NAME, '45' AGE, '1' RANK from dual union all
select 'tim' NAME, '36' AGE, '2' RANK from dual union all
select 'park' NAME, '35' AGE, '4' RANK from dual union all
select 'james' NAME, '35' AGE, '7' RANK from dual union all
select 'westbrook' NAME, '32' AGE, '99' RANK from dual

VimScript實現(xiàn)

首先實現(xiàn)一個函數(shù),用于將給一行數(shù)據(jù)添加列:

" combine the column value list with column name, adding prefix and suffix
function! CombineColumnValueAndName(valList, prefix, colList, suffix)
    let resultStr = ''
    let i = 0
    for colValue in a:valList
        let resultStr = resultStr . "\'" . colValue . "\' " . a:colList[i] . ", "
        let i = i + 1
    endfor
    " remove the last ', ' at the end
    let resultStr = strpart(resultStr, 0, strlen(resultStr) - 2)
    return a:prefix . resultStr . a:suffix
endfunction

然后,定義一個函數(shù),讀取整個緩沖區(qū)的內(nèi)容,然后逐行處理:

" convert the buffer into select-from-dual clause
function! GenerateSelectFromDual()
    " read all the buffer
    let allLines = []
    g/$/let line = getline(".") | call add(allLines, line)

    let resultLines = []

    " get all column names into a list. split by \t and keep empty
    let colNameList = split(allLines[0], '\t', 1)
    " add column names into result comment, split by space
    call add(resultLines, '-- ' . join(colNameList, ' '))
    
    " convert line by line
    let index = 1
    while index < len(allLines)
        let curLine = allLines[index]
        let valList = split(curLine, '\t', 1)
        call add(resultLines, CombineColumnValueAndName(valList, "select ", colNameList, " from dual union all"))
        let index = index + 1
    endwhile
    let resultStr = join(resultLines, "\n")
    let @u = strpart(resultStr, 0, strlen(resultStr) - 10)
    normal! ggdG
    normal! 0"up
    return ''
endfunction

最后定義一個自定義的命令,來調(diào)用這個函數(shù):

command GenerateSelectFromDual exec GenerateSelectFromDual()

效果

將前面提到的三段vimscript腳本,添加到.vimrc文件中,source $MYVIMRC生效后。執(zhí)行命令:GenerateSelectFromDual就可以達到前面需求章節(jié)描述的效果(支持某些列為空的情況)。
轉換前:

NAME    AGE RANK
paopao  5   6
kobe    45  1
kobe        1
tim 36  2
Tim 36  
park    35  4
    35  4
james   35  7
        
westbrook   32  99

轉換后:

-- NAME AGE RANK
select 'paopao' NAME, '5' AGE, '6' RANK from dual union all
select 'kobe' NAME, '45' AGE, '1' RANK from dual union all
select 'kobe' NAME, '' AGE, '1' RANK from dual union all
select 'tim' NAME, '36' AGE, '2' RANK from dual union all
select 'tim' NAME, '36' AGE, '' RANK from dual union all
select 'park' NAME, '35' AGE, '4' RANK from dual union all
select '' NAME, '35' AGE, '4' RANK from dual union all
select 'james' NAME, '35' AGE, '7' RANK from dual union all
select '' NAME, '' AGE, '' RANK from dual union all
select 'westbrook' NAME, '32' AGE, '99' RANK from dual

效果如下:


VimScriptConvertExcelData2Sql

參考資料

主要參考vim自帶的幫助系統(tǒng),比如:help add查看add函數(shù)的幫助,通過Ctrl+]可以跳轉到指定關鍵字的章節(jié),通過Ctrl+o可以跳轉回剛才的位置,通過Ctrl+i可以在歷史位置列表中往前跳轉。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容