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 11
复制代码 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+2
复制代码 test.bat- @if (0)==(0) echo off
- setlocal enabledelayedexpansion
- REM 读取文件内容
- 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 (
- REM echo,---analysis : %%a
- set "bFit=%%a"
- )
- REM echo,Analysis result : !bFit!
- REM 符合规则
- 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);
- }
复制代码 初步实现简单自定义计算式规则效果。
Rule.txt内数据格式:
第一个数为匹配数据的个数,用来进行初筛不符合数据量的行;
第二个数据起为具体需要实现的算式,变量以a字母开始,匹配被筛数据的第一个值,b为第二个值,以此类推;
可简单识别+-*算式,/式需要额外写取整操作,目前只处理了b=a[+-*]n的情况;
更复杂的算式,需要对算式拆分重组验证作更细分的处理。
未优化代码。抛砖引玉。 |