2011-12-01 47 views
0

我有一個2500行文檔,是數據表(excel)的輸出。它在文檔內一致並重復大約100次 - 儘管每行不完全重複,因爲每個循環的數據略有不同。在每個(25行)週期中,我可以收集至少30條信息,以便上傳到定製上傳器中,以填充網站中的dbs。Vim:技術方法

我首先想到的是搜索/使用子匹配(*),以正確的結構捕捉到的數據爲我所用替換它上傳到我自己的數據庫,如:

data1:data2,data3a|data3b|data3c,data4:data5 

乍看之下有足夠的vim寄存器開始,追加,然後在下一個循環之前替換並轉儲(覆蓋)寄存器 - 然後重複。但是,將來我可能想要擴展這種數據捕獲,這可能會使我的寄存器(a-z,0-9)最大,並且難以跟蹤什麼是(計數分隔符)。所以我正在考慮函數傳遞捕獲的文本以及名稱來調用它(繞過替換/子匹配想法),以便在每個循環結束時設置(let)以進行檢索和正確格式化。我看到這樣一個函數:

function SetVar(varname, varval) 
    exe "let @".a:varname." = '".a:varval."'" 
    endfunction 

我將捕獲的數據等:

:/sectionHeader/sectionFooter/g/(pieceOfInfo)/call SetVar('varname1',@)/ 

其中sectionHeader和sectionFooter定義文檔內的循環部分(範圍)。我可能會使用RegExps來捕獲這些節名稱,並使用名稱的一部分來標記變量(而不是varname1) - 或者可能是像「i」這樣的增量變量。

,然後格式化像最終輸出:

varname1:varname2,varname3|varname4|varname5,varname6:varname7 

我認爲這將是更容易維護的變量名可以作出什麼意義,從而通過上傳過程跟蹤(以及可能的未來擴展)。

問題:

  1. 這是否有意義,是其合理的架構方式,該解決方案?

  2. 你能提出一個更好的方法嗎?

+0

您能否提供一個樣本輸入文本和相應的輸出來闡明轉換? –

+0

@ib我給出的描述很清楚地概述了需求和我的預期方法。沒有迴應說(對我來說)我的方法很好。我很快就會寫這個代碼。 – Ricalsin

回答

2

awk腳本不是一個更好的選擇嗎?你可以做同樣的搜索&替換,並有一個單獨的輸出文件,並且awk的逐行操作應該避免在Vim中嘗試執行此操作時可能遇到的一些問題。

當然,如果你永遠不會重複這個過程,Vim可能不是一個壞的電話。

+0

你知道,awk腳本,前腳本。這兩方面都表現得很好。 Vim可以使用ex命令和改進的好東西來執行批處理模式(在這種情況下不可以)。 – progo