Board logo

标题: [文本处理] 能做一个去掉不成立的等式的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

  1. @echo off
  2. (for /f "tokens=1,2 delims==" %%a in (a.txt) do (
  3.     set /a "1/(%%a-(%%b))" || echo,%%a=%%b
  4. ))>b.txt 2>nul
  5. 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
试试这个呢?
  1. @if(0)==(0) echo off
  2. cscript //nologo //e:javascript "%~0"<a.txt >结果.txt
  3. pause&goto :eof
  4. @end
  5. while (!WScript.StdIn.AtEndOfStream){
  6.   var s = WScript.StdIn.ReadLine();
  7.   var a = s.replace(/(.+)=.+/,'$1');
  8.   var b = s.replace(/.+=(.+)/,'$1');
  9.   var c = eval(a)-eval(b);
  10.   if (c === 0) {WScript.Echo(s)}
  11. }
复制代码

作者: CrLf    时间: 2014-7-11 04:41

本帖最后由 CrLf 于 2014-7-11 15:41 编辑

js 的 eval 有点危险吧

第一感觉是用 vbs,先来个 vbs 版的:
  1. On Error Resume Next
  2. Dim fso,str,i,ar(65536)
  3. i=0
  4. Set fso = WScript.CreateObject("Scripting.Filesystemobject")
  5. Set ts = fso.OpenTextFile("dd.txt")
  6. Set ts2 = fso.CreateTextFile("dd_output.txt",true)
  7. Do Until ts.AtEndOfStream
  8. str = ts.ReadLine
  9.         If InStr("12","/0")=0 Then
  10.         If Eval(str) Then
  11.          ar(i)=str
  12.          i = i + 1
  13.          If i=65536 Then
  14.          ts2.WriteLine Join(ar,vbCrLf)
  15.          i = 0
  16.          End If
  17.                 End If
  18. End If
  19. Loop
  20. If i>0 Then
  21. For j=0 To i
  22. ts2.WriteLine ar(j)
  23. Next
  24. End If
复制代码
虽然有为速度稍作优化,但速度还是慢得不可忍受...

再来个 perl 版的,快多了:
  1. open(IN,"dd.txt");
  2. open(OUT,">dd_output.txt");
  3. while ($str=<IN>){
  4.     next if $str =~ /\/0/;
  5.    $str=~ s/=/==/;
  6.    if(eval($str)){print OUT ($str);}
  7. }
复制代码

作者: CrLf    时间: 2014-7-11 05:16

本帖最后由 CrLf 于 2014-7-11 15:46 编辑

eval 的效率提不上去,换了一种实现,快多了,为了效率,函数也不用了...
  1. open(IN,"dd.txt");
  2. open(OUT,">dd_out2.txt");
  3. while ($str=<IN>){
  4. next if $str =~ /\/0/;
  5. @ar=split(//,$str);
  6. $a=$b=0;
  7. for($i=1;$i<4;$i+=2){
  8. if(@ar[$i]=='+'){$a+=@ar[$i+1];next;}
  9. if(@ar[$i]=='-'){$a-=@ar[$i+1];next;}
  10. if(@ar[$i]=='*'){$a*=@ar[$i+1];next;}
  11. if(@ar[$i]=='/'){$a/=@ar[$i+1];next;}
  12. }
  13. for($i=7;$i<10;$i+=2){
  14. if(@ar[$i]=='+'){$b+=@ar[$i+1];next;}
  15. if(@ar[$i]=='-'){$b-=@ar[$i+1];next;}
  16. if(@ar[$i]=='*'){$b*=@ar[$i+1];next;}
  17. if(@ar[$i]=='/'){$b/=@ar[$i+1];next;}
  18. }
  19. if($a==$b){print OUT ($str);}
  20. }
复制代码

作者: 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://www.bathome.net/) Powered by Discuz! 7.2