标题: [文本处理] 能做一个去掉不成立的等式的BAT吗,有加减乘除的 [打印本页]
作者: nono84223860 时间: 2014-7-10 23:40 标题: 能做一个去掉不成立的等式的BAT吗,有加减乘除的
本帖最后由 nono84223860 于 2014-7-11 13:57 编辑
有大神能做一个这样的BAT吗
http://pan.baidu.com/s/1ntv7o97 3G大小的txt 压缩后只有4MB
我需要处理这个txt 由于过大2楼代码好像无法使用
用了9楼的方案后
出现了不成立的式子
5/0/5=5-8-4
5/0/5=5-8-5
5/0/5=5-8-6
5/0/5=5-8-7
5/0/5=5-8-8
5/0/5=5-8-9
5/0/5=5-9-0
5/0/5=5-9-1
5/0/5=5-9-2
5/0/5=5-9-3
5/0/5=5-9-4
5/0/5=5-9-5
5/0/5=5-9-6
作者: apang 时间: 2014-7-11 00:09
- @echo off
- (for /f "tokens=1,2 delims==" %%a in (a.txt) do (
- set /a "1/(%%a-(%%b))" || echo,%%a=%%b
- ))>b.txt 2>nul
- pause
复制代码
作者: nono84223860 时间: 2014-7-11 00:13
回复 2# apang
大神厉害,这么么快解决我的问题,以为很难
作者: terse 时间: 2014-7-11 00:16
本帖最后由 terse 于 2014-7-11 00:17 编辑
发出来 已经有了 算了
作者: nono84223860 时间: 2014-7-11 00:28
回复 4# terse
还有个 比如 1+1+1+1=
BAT处理后悔填上结果的,这个难吗?
处理前:
1+1+1+1=
处理后
1+1+1+1=4
也是有加减乘除的。如果是除法,小数点保留到后3位就可以了
作者: nono84223860 时间: 2014-7-11 00:31
回复 2# apang
不过我刚刚处理了一个3G的TXT,秒退。。。。
作者: nono84223860 时间: 2014-7-11 00:35
回复 4# terse
上面大神的,处理大文件会秒退,然后生成了一个0字节的 b.txt 处理的是3g大的txt
作者: terse 时间: 2014-7-11 02:02
回复 7# nono84223860
试试这个呢?- @if(0)==(0) echo off
- cscript //nologo //e:javascript "%~0"<a.txt >结果.txt
- pause&goto :eof
- @end
- while (!WScript.StdIn.AtEndOfStream){
- var s = WScript.StdIn.ReadLine();
- var a = s.replace(/(.+)=.+/,'$1');
- var b = s.replace(/.+=(.+)/,'$1');
- var c = eval(a)-eval(b);
- if (c === 0) {WScript.Echo(s)}
- }
复制代码
作者: CrLf 时间: 2014-7-11 04:41
本帖最后由 CrLf 于 2014-7-11 15:41 编辑
js 的 eval 有点危险吧
第一感觉是用 vbs,先来个 vbs 版的:- On Error Resume Next
-
- Dim fso,str,i,ar(65536)
-
- i=0
-
- Set fso = WScript.CreateObject("Scripting.Filesystemobject")
- Set ts = fso.OpenTextFile("dd.txt")
- Set ts2 = fso.CreateTextFile("dd_output.txt",true)
-
- Do Until ts.AtEndOfStream
- str = ts.ReadLine
- If InStr("12","/0")=0 Then
- If Eval(str) Then
- ar(i)=str
- i = i + 1
- If i=65536 Then
- ts2.WriteLine Join(ar,vbCrLf)
- i = 0
- End If
- End If
- End If
- Loop
-
- If i>0 Then
- For j=0 To i
- ts2.WriteLine ar(j)
- Next
- End If
复制代码
虽然有为速度稍作优化,但速度还是慢得不可忍受...
再来个 perl 版的,快多了:- open(IN,"dd.txt");
- open(OUT,">dd_output.txt");
-
- while ($str=<IN>){
- next if $str =~ /\/0/;
- $str=~ s/=/==/;
- if(eval($str)){print OUT ($str);}
- }
复制代码
作者: CrLf 时间: 2014-7-11 05:16
本帖最后由 CrLf 于 2014-7-11 15:46 编辑
eval 的效率提不上去,换了一种实现,快多了,为了效率,函数也不用了...- open(IN,"dd.txt");
- open(OUT,">dd_out2.txt");
-
- while ($str=<IN>){
- next if $str =~ /\/0/;
-
- @ar=split(//,$str);
- $a=$b=0;
- for($i=1;$i<4;$i+=2){
- if(@ar[$i]=='+'){$a+=@ar[$i+1];next;}
- if(@ar[$i]=='-'){$a-=@ar[$i+1];next;}
- if(@ar[$i]=='*'){$a*=@ar[$i+1];next;}
- if(@ar[$i]=='/'){$a/=@ar[$i+1];next;}
- }
- for($i=7;$i<10;$i+=2){
- if(@ar[$i]=='+'){$b+=@ar[$i+1];next;}
- if(@ar[$i]=='-'){$b-=@ar[$i+1];next;}
- if(@ar[$i]=='*'){$b*=@ar[$i+1];next;}
- if(@ar[$i]=='/'){$b/=@ar[$i+1];next;}
- }
- if($a==$b){print OUT ($str);}
- }
复制代码
作者: terse 时间: 2014-7-11 06:01
回复 10# CrLf
js eval的效率 确实提不上
作者: nono84223860 时间: 2014-7-11 09:53
,,,我复制去BAT,都无法使用。。。。
什么原因
作者: Batcher 时间: 2014-7-11 10:16
回复 12# nono84223860
你复制的几楼的代码?
作者: nono84223860 时间: 2014-7-11 10:22
回复 13# Batcher
回复 13# Batcher
8 9 10楼都试过,秒退的。
是不是少了什么插件,还是操作有误
楼顶的是3G压缩包,
我想处理这个文件
作者: Batcher 时间: 2014-7-11 11:20
回复 14# nono84223860
把9楼第一段代码保存成 test.vbs 试试
作者: nono84223860 时间: 2014-7-11 13:53
回复 15# Batcher
可以了
不过出现了这个问题。。。
5/0/5=5-8-4
5/0/5=5-8-5
5/0/5=5-8-6
5/0/5=5-8-7
5/0/5=5-8-8
5/0/5=5-8-9
5/0/5=5-9-0
5/0/5=5-9-1
5/0/5=5-9-2
5/0/5=5-9-3
5/0/5=5-9-4
5/0/5=5-9-5
5/0/5=5-9-6
有这样的不成立的数字
作者: Batcher 时间: 2014-7-11 14:38
回复 16# nono84223860
这个你应该找9楼那个家伙帮你解决
作者: nono84223860 时间: 2014-7-11 15:05
回复 9# CrLf
大神,出现了不成立的式子。。怎么解决 楼上有写
作者: nono84223860 时间: 2014-7-11 15:08
回复 17# Batcher
http://www.bathome.net/thread-30937-1-1.html
这位大神您能够帮我看一下这个吗
作者: CrLf 时间: 2014-7-11 15:41
回复 18# nono84223860
已修改。
不过还是建议用 10 楼的 perl,3G 的文件呢,可不是开玩笑...
作者: nono84223860 时间: 2014-7-11 17:44
本帖最后由 nono84223860 于 2014-7-11 17:46 编辑
回复 20# CrLf
10楼的不会用。。。。。
9楼的代码我处理了好像是2个小时左右吧
作者: CrLf 时间: 2014-7-11 22:13
回复 21# nono84223860
亲,那是 perl 代码
两个小时啊,用 10 楼代码应该至少减半吧
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |