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

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

  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
复制代码
1

评分人数

    • nono84223860: 神速。这么难的用这么快速就搞好了 非常感 ...技术 + 1

TOP

回复 2# apang


    大神厉害,这么么快解决我的问题,以为很难

TOP

本帖最后由 terse 于 2014-7-11 00:17 编辑

发出来 已经有了 算了

TOP

回复 4# terse


还有个 比如 1+1+1+1=
BAT处理后悔填上结果的,这个难吗?

处理前:
1+1+1+1=
处理后
1+1+1+1=4

也是有加减乘除的。如果是除法,小数点保留到后3位就可以了

TOP

回复 2# apang

不过我刚刚处理了一个3G的TXT,秒退。。。。

TOP

回复 4# terse

上面大神的,处理大文件会秒退,然后生成了一个0字节的 b.txt 处理的是3g大的txt

TOP

回复 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. }
复制代码

TOP

本帖最后由 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. }
复制代码
1

评分人数

    • nono84223860: 这位老师每次我有问题都帮我解决,还没测试技术 + 1

TOP

本帖最后由 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. }
复制代码

TOP

回复 10# CrLf
js eval的效率 确实提不上

TOP

,,,我复制去BAT,都无法使用。。。。
什么原因

TOP

回复 12# nono84223860


    你复制的几楼的代码?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# Batcher

回复 13# Batcher

8 9 10楼都试过,秒退的。
是不是少了什么插件,还是操作有误
楼顶的是3G压缩包,
我想处理这个文件

TOP

回复 14# nono84223860


    把9楼第一段代码保存成 test.vbs 试试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表