[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

有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
......

感谢各位大师出手,帮了我很大的忙。批处理表达式完全符合我的需要。
只是我系菜鸟,版主的代码如何使用,一时如在雾里,不知就里,烦请版主不吝赐教啊!

TOP

弱弱问一声:楼上的代码怎么使用啊?我菜鸟一个耶......

TOP

回复 6# 思想之翼


把 >>"result\_%%a" 改成 >>"result\%%~na-1.txt"

TOP

本帖最后由 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. filename = FSO.GetBaseName(FileIn)
  27. Set File = FSO.OpenTextFile(filename & ".txt",ForRead)
  28. f = File.ReadAll
  29. File.Close
  30. f = Replace(f," ",vbCrLf)
  31. Set ar = re.Execute(f)
  32. For Each a In ar
  33. str = str & a.Value & vbCrLf
  34. Next
  35. Do
  36. n = n + 1
  37. Loop Until FSO.FileExists("结果\" & filename & "_" & n + 1 & ".txt") = False
  38. Set File = FSO.CreateTextFile("结果\" & filename & "_" & n + 1 & ".txt",True)
  39. File.Write str
  40. File.Close
  41. End Sub
复制代码

TOP

呵呵,楼上误解了。在给作者的短信中,我已充分表达了谢意。的确,什么时候都不能没有感恩之心,我上面帖子的表述简化了些,没有表达出感恩和诚意,在此,我郑重表示歉意!!
上述批处理完全可以用,省去我不少麻烦,在这里再次感谢!是的,短信的感谢别人看不见的,我的感谢还要大声喊出来!!!谢谢!!!!

TOP

回复 6# 思想之翼

别人已经完全按你的要求回答你了,能不能行你不说,感谢的话你也不说,提的其它要求,别人有权不予理睬。

TOP

原文本是“01”,则批处理生成“01-1”,上述批处理又该如何修改?

TOP

  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

评分人数

TOP

用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即可。
看得多说得多,远比不上写得多。

TOP

您好!800多个三位数10个一个换行,小于100行。仅提取123、124、125、134、135、145、234、235、245、345这些数字出来,不包含这些数字的行。重新命名的1000多个文本靠批处理生成,可以在原文本号上加“_”以示区别,如原文本是“01”,则批处理生成“_01”。谢谢,这么快就给回复。

TOP

你这800多个三位数有换行吗?如果有,每行多少个?如何提取?是仅提取123、124、125、134、135、145、234、235、245、345这些数字出来,还是提取包含这些数字的行?重新命名的1000多个文本是已经存在还是靠批处理生成?
看得多说得多,远比不上写得多。

TOP

返回列表