找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26524|回复: 9

[文本处理] 需要提取文本连续数字

[复制链接]
发表于 2020-6-16 15:08:42 | 显示全部楼层 |阅读模式
00001
00002
00003
00004
00008
00010
00013
00014
00015
00016
00021
00022
00023
00026
00030
00031
00035
00036
00049
00060
00061
00062
00065


提取出连续的4位数字
提取后的文本样子如下

00001
00002
00003
00004


00013
00014
00015
00016


00021
00022
00023
00024
发表于 2020-6-16 16:38:57 | 显示全部楼层
数据保存为1.txt
for读取每一行,然后再一路判断下去
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd.>"out.txt"
  4. (
  5. for /f %%i in (1.txt) do (
  6.         if "!v1!"=="" (
  7.                 set "v1=%%i"
  8.         ) else (
  9.                 if "!v2!"=="" (
  10.                         set /a "1/(1!v1!+1-1%%i)" >nul 2>nul && ( set "v1=%%i" ) || set "v2=%%i"
  11.                 ) else (
  12.                         if "!v3!"=="" (
  13.                                 set /a "1/(1!v2!+1-1%%i)" >nul 2>nul && ( set "v1=%%i" & set "v2=" ) || set "v3=%%i"
  14.                         ) else (
  15.                                 if "!v4!"=="" (
  16.                                         set /a "1/(1!v3!+1-1%%i)" >nul 2>nul && ( set "v1=%%i" & set "v2=" & set "v3=" ) || set "v4=%%i"
  17.                                 )
  18.                         )
  19.                 )
  20.         )
  21.         if not "!v4!"=="" (
  22.                 echo !v1!
  23.                 echo !v2!
  24.                 echo !v3!
  25.                 echo !v4!
  26.                 echo.
  27.                 set "v1=" & set "v2=" & set "v3=" & set "v4="
  28.         )
  29. )
  30. )>"out.txt"
  31. type "out.txt"
  32. pause&exit
复制代码

评分

参与人数 1技术 +1 收起 理由
ai8866 + 1 谢谢大神

查看全部评分

 楼主| 发表于 2020-6-16 17:02:45 | 显示全部楼层
十分感谢大神
发表于 2020-6-16 21:56:55 | 显示全部楼层
本帖最后由 WHY 于 2020-6-17 01:03 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in (a.txt) do (
  4.     set "s1=!s2!"
  5.     set "s2=!s3!"
  6.     set "s3=!s4!"
  7.     set "s4=%%i"
  8.     if defined s1 (
  9.         set /a n1=1!s1! + 3, n2=1!s2! + 2, n3=1!s3! + 1, n4=1!s4!
  10.         if "!n1!" == "!n2!" if "!n2!" == "!n3!" if "!n3!" == "!n4!" (
  11.             echo;!s1!
  12.             echo;!s2!
  13.             echo;!s3!
  14.             echo;!s4!
  15.             Rem endlocal & setlocal enabledelayedexpansion
  16.         )
  17.     )   
  18. )
  19. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
ai8866 + 1 乐于助人

查看全部评分

发表于 2020-6-16 23:12:21 | 显示全部楼层
本帖最后由 flashercs 于 2020-6-17 06:33 编辑
  1. @echo off
  2. REM 查找step=1的等差数列arithmetric progression,长度为arraylen
  3. setlocal enabledelayedexpansion
  4. set in=series.txt
  5. set out=ArithmetricProgression.txt
  6. set arraylen=4
  7. set step=1
  8. if %arraylen% lss 1 (
  9.   echo 序列长度必须是大于0的整数
  10.   goto end
  11. )
  12. REM init: clear array
  13. for /f "delims==" %%A in ('2^>nul set arr[') do set %%A=
  14. set /a i=begin=0,end=begin+arraylen-1
  15. (
  16.   for /f "delims=" %%A in (%in%) do (
  17.     if !i! gtr %begin% (
  18.       set /a p=i-1
  19.       for %%P in (!p!) do set /a sub=1%%A-1!arr[%%P]!
  20.       if !sub! neq %step% (
  21.         set /a i=begin
  22.       )
  23.     )
  24.     set arr[!i!]=%%A
  25.     if !i! equ %end% (
  26.       for /l %%B in (%begin%,1,%end%) do echo !arr[%%B]!
  27.       echo.
  28.       set /a i=begin
  29.     ) else (
  30.       set /a i+=1
  31.     )
  32.   )
  33. )

  34. :end
  35. endlocal
  36. pause
  37. exit /b
复制代码

评分

参与人数 1技术 +1 收起 理由
Blakelee + 1 乐于助人

查看全部评分

发表于 2020-6-16 23:44:28 | 显示全部楼层
各位可以试下这种情况,3种代码输出都不一样
插入00005
具体要看楼主怎么保留
  1. 00001
  2. 00002
  3. 00003
  4. 00004
  5. 00005
  6. 00008
  7. 00010
  8. 00013
  9. 00014
  10. 00015
  11. 00016
  12. 00021
  13. 00022
  14. 00023
  15. 00026
  16. 00030
  17. 00031
  18. 00035
  19. 00036
  20. 00049
  21. 00060
  22. 00061
  23. 00062
  24. 00065
复制代码
发表于 2020-6-17 01:13:18 | 显示全部楼层
回复 6# went


    我倒是觉得,只要能够正确处理顶楼的样本就好。
发表于 2020-6-17 06:45:35 | 显示全部楼层
回复 6# went

原来忽略了一种情况,现在修改了.可以任意修改数列长度,步长可为负值
发表于 2020-6-17 17:32:49 | 显示全部楼层
  1. #! /usr/bin/env python3
  2. # ! coding:utf-8

  3. #auto detect step is negative or positive

  4. arr = list(map(lambda x: str(x).replace('\n', ''), open('series.txt', 'r')))
  5. result = list()
  6. _next = None
  7. nega_or_posi = (int(arr[1]) - int(arr[0])) /abs(int(arr[1]) - int(arr[0]))
  8. for i in range(len(arr)):
  9.     if i != len(arr)-1 and int(arr[i].lstrip('0')) + nega_or_posi == int(arr[i+1].lstrip('0')):
  10.         result.append(arr[i])
  11.         _next = arr[i + 1]
  12.     elif isinstance(_next, str):
  13.         result.append(_next)
  14.         _next = None

  15. print(result)
复制代码

评分

参与人数 1技术 +1 收起 理由
ai8866 + 1 乐于助人

查看全部评分

发表于 2020-6-17 19:13:46 | 显示全部楼层
第三方库
  1. import more_itertools as mit

  2. iterable = list(map(lambda x: int(str(x).strip('0\n')), open('num', 'r')))
  3. result = map(lambda x: [str(i).zfill(5) for i in x], list(filter(lambda x:len(x) > 1, [list(group) for group in mit.consecutive_groups(iterable)])))
  4. print(list(result))
复制代码

评分

参与人数 1技术 +1 收起 理由
ai8866 + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 01:53 , Processed in 0.023101 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表