[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
外部命令的威力在处理超大文本是彰显无遗:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (y1.txt) do (
  3. set /a "n=(10000001+n)-(n/10000000)*10000000"
  4. echo !n:~-7!:%%a
  5. ))>1.tmp
  6. sort /rec 8198 /+8 1.tmp>2.tmp
  7. (for /f "tokens=1* delims=:" %%a in (2.tmp) do (
  8. if "%%b" neq "!l!" (
  9. echo %%a
  10. set l=%%b
  11. )
  12. ))>3.tmp
  13. findstr /b /g:3.tmp 1.tmp>4.tmp
  14. (for /f "tokens=1* delims=:" %%a in (4.tmp) do echo %%b)>y2.txt
  15. del /f /q ?.tmp
  16. (for /f "delims=" %%a in (y2.txt) do (
  17. set /p=%%a:<nul
  18. for /f "tokens=3" %%b in ('find /c "%%a" y1.txt') do echo 存在%%b行重复
  19. ))>check.txt
  20. pause
复制代码
未测试速度,但是不考虑对特殊字符的兼容性的情况下,这应该比if defined快

TOP

挖坟出来,研究研究。。。

TOP

回复 38楼 的帖子

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

TOP

这个...这个。我怎么一句也没看明白啊,好像是其它的脚本吧(我的英文水平太次,无法理解),这就是VBS 么?

TOP

微软 脚本专家
如何从文本文件中删除所有重复行?
http://www.microsoft.com/china/t ... rces/hey050819.mspx
http://msdn.microsoft.com/en-us/library/ms974559
  1. Const adOpenStatic = 3
  2. Const adLockOptimistic = 3
  3. Const adCmdText = &H0001
  4. Set objConnection = CreateObject("ADODB.Connection")
  5. Set objRecordSet = CreateObject("ADODB.Recordset")
  6. strPathToTextFile = "C:\Scripts\"
  7. strFile = "Test.txt"
  8. objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  9.       "Data Source=" & strPathtoTextFile & ";" & _
  10.           "Extended Properties=""text;HDR=NO;FMT=Delimited"""
  11. objRecordSet.Open "Select DISTINCT * FROM " & strFile, _
  12.     objConnection, adOpenStatic, adLockOptimistic, adCmdText
  13. Do Until objRecordSet.EOF
  14.     Wscript.Echo objRecordSet.Fields.Item(0).Value   
  15.     objRecordSet.MoveNext
  16. Loop
复制代码
速度还不错,但文本不能太复杂,因为有FMT=Delimited

或者通过Schema.ini文件指定按固定长度(但长度多少才算合适?)
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

看来这个帖子要沉了,  zqz0012005是VBS高手,用VBS能否实现?

TOP

  1. @echo off
  2. for /f "delims=" %%i in (test.txt) do (
  3.     if not defined %%i set %%i=s & echo %%i>>result.txt)
复制代码

我是一个初学者,对上面一段代码我整整想了两三天,搞得我上班都没心情!
为了学好批处理,不上班的时候我常常在网吧一坐就是一整天(无奈几个月前买的联想本本用了不到一个月就被偷了,上班又不是上网)!
现在看到这贴总算心理舒服多了!

TOP

这个只能用第三方工具了。
正则表达式都不好使。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

原帖由 Kiming 于 2009-5-30 07:16 发表
为什么要 set %%i=s 就不能等于别的吗
“delims=" 这是什么意思啊 delims 是想删除什么啊


可以等于别的,比如set %%i=他妈
也可以,只要不是空就行

delims=这个你看下for名的帮助信息

另外既然是超大文本行,批处理效率一定不会多高,借助三方工具。。。
这里有个帖子看看:
http://www.linuxsir.org/bbs/showthread.php?t=132848

TOP

回复 30楼 的帖子

1、随便等于什么都可以,但是为了减少内存占用量,越短越好。

2、批处理for语句中tokens=*和delims=的区别是什么?
http://bbs.bathome.net/viewthread.php?tid=1654#pid8870
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

第三方工具 有谁测试下吗 我这里貌似可以的
  1. gawk "BEGIN {FS=\"-\"} !a[$1 $2]++" y1.TXT>y2.txt
复制代码
测试代码这样的
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 正在创建测试文件 y1.txt 请稍候
  3. for /l %%a in (1 1 1000) do (
  4. (for /l %%a in (1 1 2001) do echo !random!!random!!random!----!random!!random!!random!----!random!----!random!!)>>y1.txt
  5. (for /l %%a in (1 1 1001) do echo %random%----%random%----!random!!random!!random!----!random!!random!!random!)>>y1.txt
  6. )
复制代码
生成150MB左右的Y1文件
处理后 Y2文件 近100MB 左右
处理时间 13.5秒

[ 本帖最后由 terse 于 2009-5-30 13:30 编辑 ]

TOP

回复 29楼 的帖子

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

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

如果要处理的字符没有双引号(有双引号时借助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

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

TOP

返回列表