[已解决]批处理如何筛选出符合规律的连续数字?
[i=s] 本帖最后由 ngd 于 2022-5-19 10:37 编辑 [/i]文件当中的内容大致如下:第一列是序号,后面是数字
1,2
2,3
3,2
4,7
5,7
6,8
7,3
8,-9
9,-7
10,-8
11,2
12,4
13,1
14,3
15,7
16,7
17,8
18,-8
19,-9
20,-8
21,1
22,2
找出一组数字 符合如下规律:
连续3个数小于等于4接着连续3个数大于等于7再接着连续3个数小于等于-7的一组数,示例中只有第12~20这组数字符合,输出第20个数字-8即可 [code]@echo off
setlocal enabledelayedexpansion
cd /d "%~dp0"
set src=nums.txt
for /f "tokens=1-2 delims=," %%A in (%src%) do (
set a0=!a1!
set a1=!a2!
set a2=!a3!
set a3=!a4!
set a4=!a5!
set a5=!a6!
set a6=!a7!
set a7=!a8!
set a8=%%B
if defined a0 if !a0! leq 4 if defined a1 if !a1! leq 4 if defined a2 if !a2! leq 4 (
if defined a3 if !a3! geq 7 if defined a4 if !a4! geq 7 if defined a5 if !a5! geq 7 (
if defined a6 if !a6! leq -7 if defined a7 if !a7! leq -7 if defined a8 if !a8! leq -7 (
echo !a8!
)
)
)
)
endlocal
pause
exit /b
[/code] 再提供一种思路,借powershell用正则来匹配[code]#&cls&powershell "iex(gc '%~0'|out-string)"&pause&exit\b
$txt="C:\Users\lenovo\Desktop\nums.txt"
$nums=@()
gc $txt|%{$nums+=$_.split(",")[1]}
$line=$nums -join "#"
$pattern="([0-4]#|-\d+#){3}([7-9]#|[1-9]\d+#){3}(-[7-9]#|-[1-9]\d+#){3}"
$check=[regex]::matches($line,$pattern).value
($check -split "#"|?{$_ -ne ""})[-1][/code] [i=s] 本帖最后由 qixiaobin0715 于 2022-8-27 10:19 编辑 [/i]
翻出老帖练练手,兼顾数据重叠(多组数据重叠也会显示),只是不知对不对:[code]@echo off
setlocal enabledelayedexpansion
set n=-1
for /f "tokens=1,2 delims=," %%i in (nums.txt) do (
set /a n+=1
set /a m=n/3
if !m! equ 0 (
if %%j gtr 4 set n=-1
) else if !m! equ 1 (
if !n! equ 3 (
if %%j lss 7 (
if %%j gtr 4 (
set n=-1
) else (
set n=2
)
)
) else (
if %%j lss 7 (
if %%j gtr 4 (
set n=-1
) else (
set n=0
)
)
)
) else (
if %%j gtr -7 (
if %%j gtr 4 (
set /a n-=7
) else (
set /a n-=6
)
) else (
if !n! equ 8 (
echo,%%i,%%j
set n=2
)
)
)
)
pause[/code] 优化一下自己楼上的代码:[code]@echo off
setlocal enabledelayedexpansion
set n=-1
for /f "tokens=1,2 delims=," %%i in (a.txt) do (
set /a n+=1
set /a m=n/3
if !m! equ 0 (
if %%j gtr 4 set n=-1
) else if !m! equ 1 (
if %%j lss 7 (
if %%j gtr 4 (
set n=-1
) else (
if !n! equ 3 (
set n=2
) else (
set n=0
)
)
)
) else (
if %%j gtr -7 (
if %%j gtr 4 (
set /a n-=7
) else (
set /a n-=6
)
) else (
if !n! equ 8 (
echo,%%i,%%j
set n=2
)
)
)
)
pause[/code]
页:
[1]