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

[文本处理] [已解决]批处理如何从多个txt文本中批量提取指定的数值?

[复制链接]
发表于 2012-7-1 13:01:52 | 显示全部楼层 |阅读模式
有1千多个文本,每个文本有800多个三位数(不重复),位置排列随机,现在想批量分别提取出其中可能包含的123、124、125、134、135、145、234、235、245、345,写入另外重新命名的1千多个文本,烦请行家帮忙写个批处理!
每个文本三位数如下:
654 987 369 159 123 357 345 245 624 125
852 167 492 367 012 301 209 809 760 100
......
发表于 2012-7-1 13:42:34 | 显示全部楼层
你这800多个三位数有换行吗?如果有,每行多少个?如何提取?是仅提取123、124、125、134、135、145、234、235、245、345这些数字出来,还是提取包含这些数字的行?重新命名的1000多个文本是已经存在还是靠批处理生成?
 楼主| 发表于 2012-7-1 14:00:11 | 显示全部楼层
您好!800多个三位数10个一个换行,小于100行。仅提取123、124、125、134、135、145、234、235、245、345这些数字出来,不包含这些数字的行。重新命名的1000多个文本靠批处理生成,可以在原文本号上加“_”以示区别,如原文本是“01”,则批处理生成“_01”。谢谢,这么快就给回复。
发表于 2012-7-1 15:28:29 | 显示全部楼层
用findstr应该会奇慢无比:

  1. @echo off
  2. md results 2>nul
  3. for /f "delims=" %%a in ('dir /b *.txt') do (
  4.   cd.>"results\_%%a"
  5.   for %%i in (123 124 125 134 135 145 234 235 245 345) do (
  6.     findstr "%%i" "%%a">nul&&echo,%%i
  7.   )>>"results\_%%a"
  8. )
复制代码
用法:将以上代码保存为test.bat,放到该目录执行即可。

用awk应该会好点儿:

  1. BEGIN{
  2.   split("123 124 125 134 135 145 234 235 245 345",numbers)
  3.   for(number in numbers) x[numbers[number]]=""
  4. }
  5. FNR==1{
  6.   if(last!="") close(last)
  7.   last="results\_" FILENAME
  8. }
  9. {
  10.   for(i=1;i<=NF;i++)
  11.     if($i in x) print $i>last
  12. }
复制代码
用法,将以上代码保存为test.awk,下载gawk.exe,编写test.bat如下:

  1. @echo off
  2. md results 2>nul
  3. gawk -f test.awk *.txt
复制代码
然后将三个文件放到该目录,执行bat即可。
发表于 2012-7-1 17:39:36 | 显示全部楼层
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. md result
  4. for /f "tokens=1,2 delims=:" %%a in (
  5.     'findstr "123 124 125 134 135 145 234 235 245 345" *.txt'
  6. ) do (
  7.     set "var= %%b "
  8.     for %%i in (123 124 125 134 135 145 234 235 245 345) do (
  9.         if "!var: %%i =!" neq "!var!" echo %%i
  10.     )
  11. ) >>"result\_%%a"
  12. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 完美解决问题

查看全部评分

 楼主| 发表于 2012-7-1 19:59:22 | 显示全部楼层
原文本是“01”,则批处理生成“01-1”,上述批处理又该如何修改?
发表于 2012-7-1 21:05:06 | 显示全部楼层
回复 6# 思想之翼

别人已经完全按你的要求回答你了,能不能行你不说,感谢的话你也不说,提的其它要求,别人有权不予理睬。
 楼主| 发表于 2012-7-1 22:05:16 | 显示全部楼层
呵呵,楼上误解了。在给作者的短信中,我已充分表达了谢意。的确,什么时候都不能没有感恩之心,我上面帖子的表述简化了些,没有表达出感恩和诚意,在此,我郑重表示歉意!!
上述批处理完全可以用,省去我不少麻烦,在这里再次感谢!是的,短信的感谢别人看不见的,我的感谢还要大声喊出来!!!谢谢!!!!
发表于 2012-7-1 22:06:40 | 显示全部楼层
本帖最后由 CrLf 于 2012-7-3 12:42 编辑

保存为 test.vbs 或 test.bat 在要处理的目录下运行:
  1. '&start wscript /nologo "/e:vbscript" "%~0"&exit
  2. Option Explicit
  3. Dim re,FSO,Dir,file,str,i,a,ar()
  4. Const ForRead = 1

  5. Set re = New RegExp
  6. re.Global = True
  7. re.MultiLine = True
  8. re.Pattern = "123|124|125|134|135|145|234|235|245|345"

  9. Set FSO = CreateObject("Scripting.FileSystemObject")
  10. Set Dir = FSO.GetFolder(".")

  11. For Each file In Dir.Files
  12.         If file.Type = "文本文档" Then
  13.                 ReDim Preserve ar(i)
  14.                 ar(i)=file.Name
  15.                 i = i + 1
  16.         End If
  17. Next

  18. If FSO.FolderExists("结果") = False Then
  19.         FSO.CreateFolder("结果")
  20. End If

  21. For Each a In ar
  22.         Call IO(a)
  23. Next


  24. Sub IO(FileIn)
  25.         Dim File,f,ar,a,str,n,filename
  26.        
  27.         filename = FSO.GetBaseName(FileIn)
  28.         Set File = FSO.OpenTextFile(filename & ".txt",ForRead)
  29.         f = File.ReadAll
  30.         File.Close
  31.        
  32.         f = Replace(f," ",vbCrLf)
  33.         Set ar = re.Execute(f)
  34.        
  35.         For Each a In ar
  36.                 str = str & a.Value & vbCrLf
  37.         Next
  38.        
  39.         Do
  40.                 n = n + 1
  41.         Loop Until FSO.FileExists("结果" & filename & "_" & n + 1 & ".txt") = False
  42.        
  43.         Set File = FSO.CreateTextFile("结果" & filename & "_" & n + 1 & ".txt",True)
  44.         File.Write str
  45.         File.Close
  46. End Sub
复制代码
发表于 2012-7-1 22:12:50 | 显示全部楼层
回复 6# 思想之翼


把 >>"result\_%%a" 改成 >>"result\%%~na-1.txt"
 楼主| 发表于 2012-7-1 22:15:53 | 显示全部楼层
弱弱问一声:楼上的代码怎么使用啊?我菜鸟一个耶......
 楼主| 发表于 2012-7-1 22:25:56 | 显示全部楼层
感谢各位大师出手,帮了我很大的忙。批处理表达式完全符合我的需要。
只是我系菜鸟,版主的代码如何使用,一时如在雾里,不知就里,烦请版主不吝赐教啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 06:17 , Processed in 0.020992 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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