Board logo

标题: [数值计算] [已解决]批处理如何查找出多个含指定字符的数字串中的最小值 [打印本页]

作者: ohar    时间: 2009-8-3 16:38     标题: [已解决]批处理如何查找出多个含指定字符的数字串中的最小值

本帖最后由 pcl_test 于 2016-8-4 13:47 编辑

文本内容为
  1. a535 a22 u133 b135351 w566 d133 a551 d1313 a-12.12 a-0.45 d5252 a122 ...  a12452  a25 a14 d522 d52 a0.12 a-15 ...
复制代码
要求得以a开头的字符串中数字的最小值.字符串的格式是a+数字,数字包括负数、小数。更新:文本大小是1.8M,其中要搜索的a+数字大约有0.5M,在这样的情况下楼下的js代码是可以算出,但要搜索的a+数字很多时,就内存不足。我有两个思路:1先算出搜索到的第一个结果与第二个结果的最小值,再拿它与第三个结果比较得出最小值…这样函数总是比较两个数,就不会内存不足了;2先读取0.5M(或多少字符或多少行)求出最小值,再读取下一0.5M(同上),最后求出最小值
作者: ohar    时间: 2009-8-4 13:36

问题已经简化,赶快抢沙发吧!
作者: batman    时间: 2009-8-4 17:49

有小数就不适合用批来解决了,这是批的一个瓶颈。
作者: terse    时间: 2009-8-4 18:18

我是这样写的 没测试特殊情况
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=2147483647
  3. for /f "delims=" %%a in (a.txt) do (
  4.     for %%i in (%%a) do (
  5.         if "%%i"=="end" set flog=&echo !n!&set n=2147483647
  6.         if defined flog (
  7.         set "str=%%i"
  8.         if "!str:~,1!"=="a" (
  9.         set "m=!str:~1!"
  10.         set str=!str:.=!
  11.         for /l %%j in (0 1 9) do set str=!str:%%j=!
  12.            if "!str!"=="a" (
  13.            set n1=&set "n2="
  14.            if "!n:~,1!" neq "-" (
  15.            for  %%b in (n m) do for /f "tokens=1* delims=." %%m in ("!%%b!") do set %%b1=%%m&set "%%b2=%%n"
  16.            if !n1! equ !m1! (
  17.            if not "!n2!"=="" if "!n2!" gtr "!m2!" set n=!m!
  18.          ) else if !n1! gtr !m1! set n=!m!
  19.          )
  20.         )
  21.            if "!str!"=="a-" (
  22.            if "!n:~,1!" equ "-" (
  23.            for  %%b in (n m) do for /f "tokens=1* delims=." %%m in ("!%%b!") do set %%b1=%%m&set "%%b2=%%n"
  24.            if !n1! equ !m1! (
  25.            if not "!m2!"=="" if "!n2!" lss "!m2!" set n=!m!
  26.          ) else if !n1! gtr !m1! set n=!m!
  27.          ) else set n=!m!
  28.      )))
  29.            if "%%i"=="home" set "flog=x"
  30. ))
  31. pause
复制代码

作者: zqz0012005    时间: 2009-8-4 19:51     标题: JavaScript

JavaScript
  1. //&@cls&start wscript.exe -e:jscript "%~f0"&exit/b
  2. f = "C:\\Documents and Settings\\user\\桌面\\a.txt";
  3. fso = new ActiveXObject('Scripting.FileSystemObject');
  4. nums = fso.OpenTextfile(f).ReadAll().match(/\ba[-.\d]+\b/gi);
  5. s = "Math.max(" + nums.join(',').replace(/a/gi,'') + ")";
  6. WScript.Echo( eval(s) );
复制代码

作者: ohar    时间: 2009-8-4 23:32

原来BAT有个小瓶颈,怪不得少人回答。4,5楼的代码我都下了,但经手机一压缩,我都不知道从哪里换行了。先看了5楼的,又来了个JS,像VBS我也是最近几天了解,心想,坏了,还好JS有个分号.嘿嘿,没错,一双击,蹦出个12452,这么大,再看下原来是MAX.4楼的明天再测试吧。我想你一定花了不少时间,明天,明天我用WORD把那些()都换个颜色看看,够菜吧
作者: ohar    时间: 2009-8-5 20:05

5楼的js代码该怎样改成vbs的,或者该怎样用vbs传递一个path变量给js,再调用他,再返回一个结果变量给vbs
作者: ohar    时间: 2009-8-10 11:44

文件较大时,内存不足,问题出在MIN函数。以更新至顶楼

[ 本帖最后由 ohar 于 2009-8-10 11:51 编辑 ]
作者: Lumiere    时间: 2009-8-10 12:52

批处理比较小数大小相当麻烦,特别是又负数的情况下
作者: ohar    时间: 2009-8-10 14:17

看来还是要请zqz0012005
作者: ohar    时间: 2009-8-10 15:32

另外,如果文本中没有要搜索的字符,会出错,那么怎样让他继续执行别的代码呢
作者: terse    时间: 2009-8-10 17:11

原帖由 ohar 于 2009-8-10 15:32 发表
另外,如果文本中没有要搜索的字符,会出错,那么怎样让他继续执行别的代码呢

你意思是不是 没有A开头的呢  
改4楼代码这里 看可行不  if "%%i"=="end" set flog=&if !n! neq 2147483647 echo !n!&set n=2147483647
另:内存问题  你说数据1M 都没  应该没问题的啊
大小的判断是先设置一个变量  然后拿当前值的和变量比较 如当前值小 设置变量为当前值 这样一直就一变量N  内存应该不是问题吧
对了   FOR对单行字符应该有限制的吧

[ 本帖最后由 terse 于 2009-8-10 17:19 编辑 ]
作者: ohar    时间: 2009-8-10 17:42     标题: 回复 12楼 的帖子

是啊,一直只对两个值进行比较,内存肯定没问题,可我有问题了,我只想到这样的思路,不能写出代码啊
作者: terse    时间: 2009-8-10 17:48

原帖由 ohar 于 2009-8-10 17:42 发表
是啊,一直只对两个值进行比较,内存肯定没问题,可我有问题了,我只想到这样的思路,不能写出代码啊

4楼就是只对两个值比较的哦 但为什么还是有错
另你单行字符是否超出限制呢?
作者: zqz0012005    时间: 2009-8-10 20:06     标题: 回复 8楼 的帖子

看来min方法的内部实现可能也不咋地。。。

用排序的方法,未测试和逐个比较时的效率。
内存与CPU占用率很高。
  1. //&@cls&start wscript.exe -e:jscript "%~f0"&exit/b
  2. f = "C:\\Documents and Settings\\user\\桌面\\a.txt";
  3. fso = new ActiveXObject('Scripting.FileSystemObject');
  4. nums = fso.OpenTextfile(f).ReadAll().match(/\ba[-.\d]+\b/gi);
  5. nums = nums.join(',').replace(/a/gi,'').split(',');
  6. nums = nums.sort(function (x,y) {return x-y});
  7. WScript.Echo( nums[0] );
复制代码

作者: ohar    时间: 2009-8-10 21:15     标题: 回复 15楼 的帖子

测试了,10M的,bat得 -.999,js得-4.097,时间上就相差很大,正确最小值是后者。zqz0012005能告知js的计算过程吗
作者: zqz0012005    时间: 2009-8-10 21:41     标题: 回复 15楼 的帖子

没有逐个比较的效率高(当然15楼的方法主要作用是排序)
  1. //&@cls&start wscript.exe -e:jscript "%~f0"&exit/b
  2. f = "C:\\Documents and Settings\\user\\桌面\\a.txt";
  3. fso = new ActiveXObject('Scripting.FileSystemObject');
  4. nums = fso.OpenTextfile(f).ReadAll().match(/\ba[-.\d]+\b/gi);
  5. nums = nums.join(',').replace(/a/gi,'').split(',');
  6. min = parseFloat(nums[0]);
  7. for (i=0;i<nums.length;i++) {
  8.     num = parseFloat(nums[i]);
  9.     if(num<min) min=num;
  10. }
  11. WScript.Echo( min );
复制代码

作者: Lumiere    时间: 2009-8-10 23:38

用其他语言简单多了,批处理也有不尽如人意的地方
作者: pcl_test    时间: 2016-8-4 19:04

第三方
  1. gawk "{for(i=1;i<=NF;i++){if($i~/^a-?[0-9]*\.?[0-9]+$/){j++;sub(/a/,\"\",$i);if(j==1){min=$i*1}else{if($i*1<min)min=$i*1}}}}END{print min}" "文本.txt"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2