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

这是VBT论坛的代码

@echo off
for /f "delims=" %%i in (test.txt) do (
    if not defined %%i set %%i=s & echo %%i>>result.txt)
大概需要30 s就可以了
可是这段代码我有点不理解 不知LS的道能否解释下
【只有相信成功,自己才会成功】

TOP

30s就可以遍历百万行的文本?没测试过,但对这类代码的评论,你没看到他8楼的回复吗?
技术问题请到论坛发帖求助!

TOP

真的是30s啊
我测试了的 你测试没
那个8L的说有问题 我怎么没测试出来呢
【只有相信成功,自己才会成功】

TOP

回复 9楼 的帖子

如果只有几个重复行,那就意味着要创建100多万个文件夹,这对于使用FAT32的朋友来说,是几乎无法实现的。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回LS的啊

那16L;的 不是已经给出了代码了吗 可以了的 我还测试了
【只有相信成功,自己才会成功】

TOP

回复 20楼 的帖子

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

TOP

回复 16楼 的帖子

批处理是不允许无限制的定义变量的,这个代码能够成功只是个例。如果随风把顶楼生成测试文本的脚本改改,让每行长度增加一倍,这时生成的文件将接近100MB,你再试试那个方案还能成功否?

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

TOP

回21L的

我是NTFS的 那个测试的代码生成的只有100多个文件夹
【只有相信成功,自己才会成功】

TOP

回复 23楼 的帖子

19楼说的不够清楚吗?没关系,咱们再强调一遍吧:
如果只有几个重复行,那就意味着要创建100多万个文件夹,这对于使用FAT32的朋友来说,是几乎无法实现的。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 24楼 的帖子

只有100W行啊  100MB的文件估计也有500W行了 只要求100w的文件
【只有相信成功,自己才会成功】

TOP

楼主,能否稍微改改你生成测试文本的代码,要求的效果是100多W行文本,文件体积超过100MB,给感兴趣的朋友们看看?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

一个cmd最大可以使用内存为64M,除去一些系统和BAT程序本身占用,应该有60M可以给变量使用,所有字符是以字为单元,一变量定义就算只有:一个字变量名,一个等号,一个字符值,一个分隔符,最少要占4个字的空间,也就是说以最小的变量定义计算,只可以定义:60/2/4=7.5M个变量
如果这100W行中只有少数几行是重复的话,就要定义近100W个变量,相当一1M个变量,可是如果定义的变量名平均超过28个字符的话,无疑就会溢出。就此题来说用定义变量判断重复的方法,出错的可能性有一半。
还有一点,当定义的变量数量过大时,系统去搜索变量名也是需要时间的。
我曾经做过这种测试,就是不停的定义变量,看一个cmd到底能定义多少个变量。
最后是定义到该cmd进程序占用40多M内存时就不耐烦了,等待了好长时间,越是到最后就越慢。

TOP

如果要处理的字符没有双引号(有双引号时借助sed先用特殊字符比如中文下的特殊字符,这个花不了到少时间)
新打开一个命令行然后:
for /f "eol= delim=" %a in (tmp.txt)do @if not defined "%a" (@echo.%a>>your.txt&set "%%a=1")
echo.  >>file 的效率大概是每秒5000次,那么100万行需要200秒左右

TOP

原帖由 Kiming 于 2009-5-29 20:42 发表
@echo off
for /f "delims=" %%i in (test.txt) do (
    if not defined %%i set %%i=s & echo %%i>>result.txt)
大概需要30 s就可以了
可是这段代码我有点不理解 不知LS的道能否解释下


  if not defined %%i set %%i=s
这句就是保证单行输出的
当一个行第一次出现时,输出后给他一个赋值(随便什么数字都型),当下次它再次出现时,因为有上次的set ...=s
所以已经是"defined"了,自然后面的echo %%i>>result.txt就不会执行了

你把 if not defined %%i set %%i=s & echo %%i>>result.txt改成

if not defined %%i (echo %%i>>result.txt&set %%i=s ) 就容易理解了(注意加上括号)

但是这个代码有bug的,上楼就没有bug了
对于开头行是;还有行内含有空格,特殊字符的<>|等的行
for /f "eol= delim=" %a in (tmp.txt)do @if not defined "%a" @(echo.%a>>your.txt&set "%a=1")
都可以解决

[ 本帖最后由 plp626 于 2009-5-30 03:42 编辑 ]

TOP

回复 29楼 的帖子

为什么要 set %%i=s 就不能等于别的吗
“delims=" 这是什么意思啊 delims 是想删除什么啊
【只有相信成功,自己才会成功】

TOP

返回列表