Board logo

标题: [文本处理] [已解决]批处理处理文本时行太长怎么办? [打印本页]

作者: cjiabing    时间: 2010-4-29 22:32     标题: [已解决]批处理处理文本时行太长怎么办?

批处理在处理文本时通常都是以行为单位处理的,可是如果一个文本里只有一行,而且该行有几千字,这时批处理似乎有所顾忌了,特别是for和findstr,它们在处理超过一定字节的行时就罢工,不懂这是什么原因。
请各路高手支个招,用什么办法可以处理过长的行?给个思路和方法,最好是批处理直接自己处理的。
提供一个附件,我想提取里面的字符,比如提取time后面的数字12723,如何做到?谢谢!
作者: x9tiancmd    时间: 2010-4-30 09:44

程序也是东西,楼主你又何苦为难他呢?
作者: Spring    时间: 2010-4-30 10:42

批处理有长度限制的,用脚本去处理。
作者: qzwqzw    时间: 2010-4-30 11:06

可以考虑使用正则文本替换工具
将要提取的串过滤出来就可以了
比较喜欢baiy的fr系列工具
sed之流门槛太高不想过
作者: 523066680    时间: 2010-4-30 11:35

echo 12723
作者: Spring    时间: 2010-4-30 11:51

原帖由 523066680 于 2010-4-30 11:35 发表
echo 12723


不愧是文字消遣区的灵魂人物!
作者: cjiabing    时间: 2010-4-30 12:31

原帖由 Spring 于 2010-4-30 11:51 发表


不愧是文字消遣区的灵魂人物!

两位大师请说通俗易懂的国语嘛!~
作者: cjiabing    时间: 2010-4-30 12:34

原帖由 qzwqzw 于 2010-4-30 11:06 发表
可以考虑使用正则文本替换工具
将要提取的串过滤出来就可以了
比较喜欢baiy的fr系列工具
sed之流门槛太高不想过

哦,都没碰过这些问题,兄弟有简单具体可行的给个例子喂?
最近都在进行与网页有关的文本处理,遇到最多的问题,一是特殊符号的过滤,二九是这种超长行的截取,不知道哪位兄弟在这方面有经验和特长,教教我们这些新手!~
作者: hanyeguxing    时间: 2010-4-30 12:45

因为楼主给出的示例长度依然符合条件:最大单个环境变量大小为 8192 字节。所以:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /F "delims=" %%a in (1.txt) do for %%b in (%%a) do (set b=%%b
  3. set b=!b:"=!
  4. for /F "tokens=1,2* delims=:}," %%c in ("!b!") do if /i "%%c"=="time" echo.%%c:%%d)
  5. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-1 08:00 编辑 ]
作者: Spring    时间: 2010-4-30 13:28

原帖由 cjiabing 于 2010-4-30 12:34 发表

哦,都没碰过这些问题,兄弟有简单具体可行的给个例子喂?
最近都在进行与网页有关的文本处理,遇到最多的问题,一是特殊符号的过滤,二九是这种超长行的截取,不知道哪位兄弟在这方面有经验和特长,教教我们这些 ...


既然你涉及网页,那就必需要学会用 JavaScript 脚本,批处理在这方面的能力很有限,而且很多问题它根本就不应该以普通字符串的方式来解决,比如你给出的这个,最外层圆括号里面是一个再标准不过的对象了,如果网页要传输数据给脚本基本上都用这种格式。

给你写了个本地脚本的例子,保存为 .js 文件运行。
  1. var txtFile = "超长的行.txt ";
  2. var fso = WScript.CreateObject("Scripting.FileSystemObject");
  3. var txt = fso.OpenTextFile(txtFile,1).ReadAll();
  4. var showGroupJoinList = function(obj){
  5.   var gpTime = "所有的 time : \r\n";
  6.   var lst = obj.data.list;
  7.   for(var i in lst) {
  8.     gpTime += "\r\n" + lst[i].time + " \t " + lst[i].name + "(" + lst[i].groupid + ")\r\n";
  9.     var members = lst[i].action.member;
  10.     for(var j=0; j<members.length; j++) {
  11.       gpTime += "    " + members[j].time + " \t     " + members[j].nick + "(" + members[j].uin + ")\r\n";
  12.     }
  13.   }
  14.   WScript.Echo(gpTime);
  15. }
  16. eval(txt);
复制代码

作者: GNU    时间: 2010-4-30 20:54

  1. sed "s/,/\n/g" a.txt | sed "/time/!d;s/[^0-9]//g"
复制代码

作者: cjiabing    时间: 2010-5-1 14:31

hanyeguxing 给出的是批处理解决的办法,思路很好,赞一个!
Spring 给出的是JS脚本,效果不错,看起来有点像网页编程,呵呵,看来我真的要学学了。
GNU 给出的是第三方,很简单,不错。
    因为批处理的功能有限,许多东西都像玩脑筋急转弯一样,非得掏空心思费尽力气才能巧妙的解决,初始学学还可以当做大脑体操练练,久了就觉得顽固不化了。
    用脚本处理网页文本,这是它的特长,看来那些纯粹的P主义们应该放下理想的追求,而更务实些,促使批处理与其它编程语言的大融合。
    很多人排斥第三方,以前我也如此,但事实上,第三方有点像集成电路,效率更高,省心省事。
谢谢各位,向你们学习了!~

[ 本帖最后由 cjiabing 于 2010-5-1 14:33 编辑 ]
作者: zjw767676    时间: 2010-5-2 09:49

各种工具各有各的长处,将批处理当做治百病的仙丹当然是不行的
作者: sgaizxt001    时间: 2010-5-2 23:59

各有所长,问题是我一个都不会




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