标题: [文本处理] [已解决]批处理处理文本时行太长怎么办? [打印本页]
作者: 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 字节。所以:- @echo off&setlocal enabledelayedexpansion
- for /F "delims=" %%a in (1.txt) do for %%b in (%%a) do (set b=%%b
- set b=!b:"=!
- for /F "tokens=1,2* delims=:}," %%c in ("!b!") do if /i "%%c"=="time" echo.%%c:%%d)
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-5-1 08:00 编辑 ]
作者: Spring 时间: 2010-4-30 13:28
原帖由 cjiabing 于 2010-4-30 12:34 发表
哦,都没碰过这些问题,兄弟有简单具体可行的给个例子喂?
最近都在进行与网页有关的文本处理,遇到最多的问题,一是特殊符号的过滤,二九是这种超长行的截取,不知道哪位兄弟在这方面有经验和特长,教教我们这些 ...
既然你涉及网页,那就必需要学会用 JavaScript 脚本,批处理在这方面的能力很有限,而且很多问题它根本就不应该以普通字符串的方式来解决,比如你给出的这个,最外层圆括号里面是一个再标准不过的对象了,如果网页要传输数据给脚本基本上都用这种格式。
给你写了个本地脚本的例子,保存为 .js 文件运行。
- var txtFile = "超长的行.txt ";
- var fso = WScript.CreateObject("Scripting.FileSystemObject");
- var txt = fso.OpenTextFile(txtFile,1).ReadAll();
- var showGroupJoinList = function(obj){
- var gpTime = "所有的 time : \r\n";
- var lst = obj.data.list;
- for(var i in lst) {
- gpTime += "\r\n" + lst[i].time + " \t " + lst[i].name + "(" + lst[i].groupid + ")\r\n";
- var members = lst[i].action.member;
- for(var j=0; j<members.length; j++) {
- gpTime += " " + members[j].time + " \t " + members[j].nick + "(" + members[j].uin + ")\r\n";
- }
- }
- WScript.Echo(gpTime);
- }
- eval(txt);
复制代码
作者: GNU 时间: 2010-4-30 20:54
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |