1.txt | 01 02 03 04 05 | | 01 02 03 04 06 | | 01 02 03 04 07 | | 01 02 03 04 08 | | 01 02 03 04 09 | | 01 02 03 04 10 | | 01 02 03 04 11COPY |
rule.txt | 5 b=a+1 c=b+1 d=c+1 e=d+1 | | 5 b=a+1 c=b+1 d=c+1 e=d+2COPY |
test.bat | @if (0)==(0) echo off | | setlocal enabledelayedexpansion | | | | for /f "tokens=*" %%i in ('type 1.txt') do ( | | set "strLine=%%i" | | echo,Line data : !strLine! | | echo, | | set "bFit=1" | | call :_analysis | | if "!bFit!" EQU "0" ( | | echo,不符算式规则... | | ) else ( | | echo,符合算式规则... | | ) | | pause | | ) | | | | pause | | exit /b | | | | | | :_analysis | | ( | | for /f "tokens=*" %%i in ('type rule.txt') do ( | | echo,Rule data : %%i | | cscript -nologo -e:jscript %~s0 CheckAlgorithm "!strLine!" "%%i" | | for /f "tokens=*" %%a in ('cscript -nologo -e:jscript %~s0 CheckAlgorithm "!strLine!" "%%i"') do ( | | | | set "bFit=%%a" | | ) | | | | | | if "!bFit!" EQU "1" goto :EOF | | ) | | goto :EOF | | ) | | | | | | @end | | | | var func = WScript.Arguments(0); | | | | switch (func) { | | case "CheckAlgorithm": | | var strSrc = WScript.Arguments(1); | | var strAlg = WScript.Arguments(2); | | CheckAlgorithm(strSrc, strAlg); | | break; | | | | default:; | | } | | | | function GetColData(str, nCol) { | | //WScript.Echo("str is : " + str); | | //WScript.Echo("nCol : " + nCol); | | var nLen = str.split(" ").length; | | return nCol <= nLen ? 1 : 0; | | } | | | | function CheckAlgorithm(str1, str2) { | | /// 检测数据个数是否符合 | | var strAlgs = str2.split(" "); | | WScript.Echo("strAlgs : " + strAlgs); | | var nCol = strAlgs[0]; | | var nRet = GetColData(str1, nCol); | | if (!nRet) { | | WScript.Echo("0"); | | return; | | } | | var nNums = str1.split(" "); | | WScript.Echo("nNums : " + nNums); | | /// 逐行对比算式是否符合 | | for (var i=1; i<strAlgs.length; i++) { | | strAlgTmp = strAlgs[i]; | | WScript.Echo("Check algorithm : " + strAlgTmp); | | var n1 = strAlgTmp.replace(/(\w)=.*/i, "$1"); | | var n2 = strAlgTmp.replace(/.=(\w).*/i, "$1"); | | var nP = strAlgTmp.replace(/.=.(.).*/i, "$1"); | | var n3 = strAlgTmp.replace(/.=..(.*)/i, "$1"); | | var strCodec = ""; | | strCodec += parseInt(nNums[n1.toUpperCase().charCodeAt(0)-65]) + "==" + parseInt(nNums[n2.toUpperCase().charCodeAt(0)-65]) + nP + n3; | | WScript.Echo(strCodec); | | nRet = eval(strCodec); | | if (!nRet) { | | WScript.Echo("0"); | | return; | | } | | } | | | | WScript.Echo(nRet ? 1 : 0); | | }COPY |
初步实现简单自定义计算式规则效果。
Rule.txt内数据格式:
第一个数为匹配数据的个数,用来进行初筛不符合数据量的行;
第二个数据起为具体需要实现的算式,变量以a字母开始,匹配被筛数据的第一个值,b为第二个值,以此类推;
可简单识别+-*算式,/式需要额外写取整操作,目前只处理了b=a[+-*]n的情况;
更复杂的算式,需要对算式拆分重组验证作更细分的处理。
未优化代码。抛砖引玉。 |