我有一个2,500行文档,它是数据表(excel)的输出。它是一致的,并且在文档中重复约100次 - 尽管每行不能完美重复,因为每个周期的数据略有不同。在每个(25行)周期中,我可以收集至少30条信息,以便上传到定制的上传器中以填充网站中的dbs。
我的第一个想法是使用子匹配(*)搜索/替换正确构造捕获的数据,以便将其上传到我自己的数据库中,例如:
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
我认为这将更容易维护,因为变量名称可以有意义,从而跟踪上传过程(以及可能的未来扩展)。
问题:
这是否有意义,作为此解决方案的架构方法是否合理?
你能建议一个更好的方法吗?
答案 0 :(得分:2)
awk脚本不是更好的选择吗?你可以做同样的搜索和替换,并有一个单独的输出文件,awk的逐行操作应该避免在尝试在Vim中执行此操作时可能遇到的一些问题。
当然,如果你永远不会重复这个过程,那么Vim可能不是一个糟糕的电话。