批处理之家's Archiver

ngd 发表于 2022-5-17 18:56

[已解决]批处理如何筛选出符合规律的连续数字?

[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即可

flashercs 发表于 2022-5-17 23:20

[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]

for_flr 发表于 2022-5-19 11:31

再提供一种思路,借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]

qixiaobin0715 发表于 2022-8-27 10:17

[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]

qixiaobin0715 发表于 2022-9-19 15:17

优化一下自己楼上的代码:[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]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.