工作中遇到的一个场景;
先来看看文件内容:
全选√, 标题1,标题2,标题3,标题4,标题5,标题6,标题7
True,[zh]5682996,,,,,,,,,,,,
True,102591567375,,140.5,0,00,x
True,103746390600,,74.86,0,D01,y
需要进行预处理:
1. 只要第2行以后的内容,也就是第3、4行;
2. 只要第2、4、6、7列的内容;
3. 第6列需要进行处理,处理逻辑在这个文件来讲是确定的;
4. 如果换一个文件,读取的行列,需要处理的列的逻辑就无法确定了
分析:
如果只是读出指定的行列,这个不难,但是要对相应的列进行处理也不难,但是要把处理的逻辑也剥离出来,这种情况处理的比较少,其实也不难。
解决方法:
在VBS中有个函数叫做excute(“脚本”),可以直接执行vbs脚本的字符串,类似其他语言的eval。这个问题就简单了。
'处理文件,读出需要的行和列
Function FblndoFile(strIn,strRow,strCol,strD,strOut)
dim sFileCont
dim arrR
dim arrC
dim strRet
FblndoFile=False
'打开输入文件,读出内容到一个变量
if not FblnFileExist(strIn) then
Log.Warning(strIn & " 不存在")
FblndoFile=False
exit Function
End If
sFileCont=aqFile.ReadWholeTextFile(strIn,aqFile.ctUnicode)
strRet=""
arrPc=split(strCol,",")
for i=clng(strRow)-1 to ubound(arrR)
arrC=split(arrR(i),",")
for j=0 to ubound(arrPc)
Log.Message("strD:" & strD)
Execute(strD)
strRet=strRet & arrC(clng(arrPc(j))-1) & ","
next
strRet=left(strRet,len(strRet)-1) & vbcrlf
next
call aqFile.WriteToTextFile(strOut,strRet,aqFile.ctUnicode,False)
FblndoFile=true
End Function
参考这个函数,就知道,行列包括预处理的逻辑都可以提前配置到文件里面了,看看调用方法:
strIn=Project.Path & "data\file2.txt"
strRow="3"
strCol="2,3,4,5,6,7,8,9,10,13,14"
strD=""
strOut=Project.Path & "data\file2.tmp.txt"
If FblndoFile(strIn,strRow,strCol,strD,strOut) then
Showmessage("搞定!")
End if
小结:
逻辑放哪里一直是个问题,最初的时候放在代码里面,发现不方便配置;于是整理逻辑放进数据库,想改变就直接在数据库中进行配置;等用久了,发现数据库的配置越来越无法适应无穷复杂的业务逻辑,最后就会变得和我这个程序一样,写一个框架,把所有的逻辑扔到外面去,可以解决所有的业务逻辑配置问题,算是一个适应力非常强的解决方案了。