2011-12-01 8 views
0

J'ai un document de 2 500 lignes qui est la sortie d'une feuille de données (excel). Il est cohérent et répété environ 100 fois dans le document - bien qu'il ne se répète pas parfaitement par ligne car les données par cycle varient légèrement. Sur chaque cycle (25 lignes), je pourrais rassembler au moins 30 informations à télécharger dans un uploader personnalisé pour remplir dbs sur un site web.Vim: Approche technique

Ma première pensée est de rechercher/remplacer en utilisant le submatch (*) pour structurer correctement les données capturées pour mon usage en le téléchargeant dans mon propre db, comme:

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

À première vue, il y a assez vim enregistre pour commencer, ajouter, puis remplacer et vider (écraser) les registres avant le cycle suivant - puis répéter. Mais à l'avenir, je pourrais vouloir étendre cette capture de données, ce qui pourrait maximiser mes registres (a-z, 0-9) ET rendre difficile de garder une trace de quoi (compter les délimiteurs). Donc je suis en train d'envisager des fonctions pour passer le texte capturé avec un nom pour l'appeler (en contournant l'idée de remplacement/submatch) afin d'être mis (let) pour la récupération et le formatage approprié à la fin de chaque cycle. Je vois une fonction comme:

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

je capturer les données comme:

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

où le sectionHeader et sectionFooter définissent la partie vélo (plage) dans le document. J'utiliserais probablement RegExps pour capturer ces noms de section et utiliser une partie du nom pour étiqueter la variable (au lieu de varname1) - ou peut-être une variable incrémentante comme "i".

et puis formatez la sortie finale comme:

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

Je pense que ce serait beaucoup plus facile à maintenir que les noms de variables pourraient être faits pour donner un sens, en gardant ainsi la piste à travers le processus de téléchargement (et possible Expansion future).

Questions:

  1. -t-il un sens et est-il raisonnable une approche architecturale de cette solution?

  2. Pouvez-vous suggérer une meilleure approche?

+0

Pourriez-vous fournir un exemple de texte d'entrée et la sortie correspondante pour clarifier la transformation? –

+0

@ib La description que j'ai donnée décrit très clairement les exigences et mon approche. Le manque de réponse dit (à moi) que mon approche est bien. Je vais écrire ce code bientôt. – Ricalsin

Répondre

2

Un script awk ne serait-il pas un meilleur choix pour cela? Vous pouvez faire le même type de recherche: & replace, et avoir un fichier de sortie séparé, et l'opération ligne par ligne d'awk devrait éviter certains des problèmes que vous pourriez rencontrer en essayant de le faire dans Vim.

Bien sûr, si vous ne répétez jamais ce processus, Vim pourrait ne pas être un mauvais appel.

+0

Vous savez, scripts awk, ex scripts. Les deux agissent bien sur cette entrée. Vim peut faire le mode batch (et dans ce cas peut s'en passer) avec des commandes ex et des goodies améliorés. – progo