标题: [文本处理] [已解决]批处理如何从多个txt文本中批量提取指定的数值? [打印本页]
作者: 思想之翼 时间: 2012-7-1 13:01 标题: [已解决]批处理如何从多个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
......
作者: weichenxiehou 时间: 2012-7-1 13:42
你这800多个三位数有换行吗?如果有,每行多少个?如何提取?是仅提取123、124、125、134、135、145、234、235、245、345这些数字出来,还是提取包含这些数字的行?重新命名的1000多个文本是已经存在还是靠批处理生成?
作者: 思想之翼 时间: 2012-7-1 14:00
您好!800多个三位数10个一个换行,小于100行。仅提取123、124、125、134、135、145、234、235、245、345这些数字出来,不包含这些数字的行。重新命名的1000多个文本靠批处理生成,可以在原文本号上加“_”以示区别,如原文本是“01”,则批处理生成“_01”。谢谢,这么快就给回复。
作者: weichenxiehou 时间: 2012-7-1 15:28
用findstr应该会奇慢无比:- @echo off
- md results 2>nul
- for /f "delims=" %%a in ('dir /b *.txt') do (
- cd.>"results\_%%a"
- for %%i in (123 124 125 134 135 145 234 235 245 345) do (
- findstr "%%i" "%%a">nul&&echo,%%i
- )>>"results\_%%a"
- )
复制代码
用法:将以上代码保存为test.bat,放到该目录执行即可。
用awk应该会好点儿:- BEGIN{
- split("123 124 125 134 135 145 234 235 245 345",numbers)
- for(number in numbers) x[numbers[number]]=""
- }
- FNR==1{
- if(last!="") close(last)
- last="results\_" FILENAME
- }
- {
- for(i=1;i<=NF;i++)
- if($i in x) print $i>last
- }
复制代码
用法,将以上代码保存为test.awk,下载gawk.exe,编写test.bat如下:- @echo off
- md results 2>nul
- gawk -f test.awk *.txt
复制代码
然后将三个文件放到该目录,执行bat即可。
作者: powerbat 时间: 2012-7-1 17:39
- @echo off
- setlocal enableDelayedExpansion
- md result
- for /f "tokens=1,2 delims=:" %%a in (
- 'findstr "123 124 125 134 135 145 234 235 245 345" *.txt'
- ) do (
- set "var= %%b "
- for %%i in (123 124 125 134 135 145 234 235 245 345) do (
- if "!var: %%i =!" neq "!var!" echo %%i
- )
- ) >>"result\_%%a"
- pause
复制代码
作者: 思想之翼 时间: 2012-7-1 19:59
原文本是“01”,则批处理生成“01-1”,上述批处理又该如何修改?
作者: apang 时间: 2012-7-1 21:05
回复 6# 思想之翼
别人已经完全按你的要求回答你了,能不能行你不说,感谢的话你也不说,提的其它要求,别人有权不予理睬。
作者: 思想之翼 时间: 2012-7-1 22:05
呵呵,楼上误解了。在给作者的短信中,我已充分表达了谢意。的确,什么时候都不能没有感恩之心,我上面帖子的表述简化了些,没有表达出感恩和诚意,在此,我郑重表示歉意!!
上述批处理完全可以用,省去我不少麻烦,在这里再次感谢!是的,短信的感谢别人看不见的,我的感谢还要大声喊出来!!!谢谢!!!!
作者: CrLf 时间: 2012-7-1 22:06
本帖最后由 CrLf 于 2012-7-3 12:42 编辑
保存为 test.vbs 或 test.bat 在要处理的目录下运行:- '&start wscript /nologo "/e:vbscript" "%~0"&exit
- Option Explicit
- Dim re,FSO,Dir,file,str,i,a,ar()
- Const ForRead = 1
-
- Set re = New RegExp
- re.Global = True
- re.MultiLine = True
- re.Pattern = "123|124|125|134|135|145|234|235|245|345"
-
- Set FSO = CreateObject("Scripting.FileSystemObject")
- Set Dir = FSO.GetFolder(".")
-
- For Each file In Dir.Files
- If file.Type = "文本文档" Then
- ReDim Preserve ar(i)
- ar(i)=file.Name
- i = i + 1
- End If
- Next
-
- If FSO.FolderExists("结果\") = False Then
- FSO.CreateFolder("结果\")
- End If
-
- For Each a In ar
- Call IO(a)
- Next
-
-
- Sub IO(FileIn)
- Dim File,f,ar,a,str,n,filename
-
- filename = FSO.GetBaseName(FileIn)
- Set File = FSO.OpenTextFile(filename & ".txt",ForRead)
- f = File.ReadAll
- File.Close
-
- f = Replace(f," ",vbCrLf)
- Set ar = re.Execute(f)
-
- For Each a In ar
- str = str & a.Value & vbCrLf
- Next
-
- Do
- n = n + 1
- Loop Until FSO.FileExists("结果\" & filename & "_" & n + 1 & ".txt") = False
-
- Set File = FSO.CreateTextFile("结果\" & filename & "_" & n + 1 & ".txt",True)
- File.Write str
- File.Close
- End Sub
复制代码
作者: powerbat 时间: 2012-7-1 22:12
回复 6# 思想之翼
把 >>"result\_%%a" 改成 >>"result\%%~na-1.txt"
作者: 思想之翼 时间: 2012-7-1 22:15
弱弱问一声:楼上的代码怎么使用啊?我菜鸟一个耶......
作者: 思想之翼 时间: 2012-7-1 22:25
感谢各位大师出手,帮了我很大的忙。批处理表达式完全符合我的需要。
只是我系菜鸟,版主的代码如何使用,一时如在雾里,不知就里,烦请版主不吝赐教啊!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |