2011-12-01 61 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