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

[文件操作] [已解决]DAT文件中有ASCII码分隔,批处理是否能调用ASCII码当作分隔符?

  1. @echo off&setlocal enabledelayedexpansion
  2. call ascmap $
  3. for %%a in (123.dat) do (
  4.   for /f "delims=" %%b in (%%a) do (
  5.     set "pind=!$:~0x05,1!"
  6.     set "pind=;"
  7.     set "str=%%b"
  8.     set "str=!str:;= !"
  9.       for %%i in (!str!) do (
  10.         for %%j in (!str!) do (
  11.           if "%%i" equ "%%j" set /a n+=1
  12.         )
  13.         if !n! gtr 3 del %%a 2>nul
  14.         set n=
  15.       )
  16.    )
  17. )
  18. pause
复制代码
拜读了论坛高手的文章,想实现效果
在dat文件中
都由 草花符号 作为数据的分隔,查询了 ASCII 码例,是 0x05, 是否可以比对分隔符中的内容,发现重复超过3次删除该dat文件。

例子:A.dat (以下草花为符号,不是汉字。)

草花HD-4F草花ED-2F草花6D-3F草花HD-GF草花HD-4F草花HD-4F草花FD-3F草花ED-GF草花HD-4F草花


因为文件内容中有 "草花HD-4F" 3个以上,所以将DAT 文件删除。

!$:~0x05,1! 为什么最后是 ,1 是第一行的意思吗? 还有 !  ! 之间 是否能再次赋值?
  1. @echo off&setlocal enabledelayedexpansion
  2. call ascmap $
  3. for %%a in (123.dat) do (
  4.   for /f "delims=" %%b in (%%a) do (
  5.     set "str=%%b"
  6.     set "str=!str:!$:~0x05,1!= !"
  7.       for %%i in (!str!) do (
  8.         for %%j in (!str!) do (
  9.           if "%%i" equ "%%j" set /a n+=1
  10.         )
  11.         if !n! gtr 3 del %%a 2>nul
  12.         set n=
  13.       )
  14.    )
  15. )
  16. pause
复制代码
貌似也是不成功,求高手指点,谢谢了。

使用 hiew 8.1 查看了十六进制,对unicode 和 ascii 编码的区别不是很理解。

call ascmap $  已经按照"plp626" 大侠的加载成功,并在屏幕下能够打印ASCII字符,附原DAT文件

因为论坛限制上传rar文件,只能将附件改名成txt,下载下来改名成RAR,解压之后有123.dat 和 a.dat 两个文件,删除那个重复内容多的那个123.dat, a.dat 保留。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 18# hfg1977


    谢谢你,真的,略微修改之后,测试成功!!!!

TOP

回复 18# hfg1977


    好的,谢谢,我去试试看~!

TOP

本帖最后由 hfg1977 于 2011-8-24 21:40 编辑

唯一的第三方 就是 ascmap  在本论坛下的,
http://www.bathome.net/thread-12347-1-1.html
ver 1.01.02

以你上传的两个文件测试的.

ascmap 还真不会用,

修改一下就好了,
@echo off
setlocal enabledelayedexpansion&cls            在这里加一句,下面不变
....
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

回复 16# hfg1977


    运算符不存在,大哥,你是不是用了第三方的工具?我没有此工具,是否上传?

TOP

  1. @echo off
  2. call ascmap $
  3. for /f "tokens=* delims=" %%i in ('dir /a-d/b *.dat') do (
  4. echo.正在处理:%%~i&endlocal&setlocal enabledelayedexpansion
  5. for /f "tokens=* usebackq delims=" %%a in ("%%~i") do (
  6. set "str=%%a"
  7. set "str=!str:%$:~0x01,1%= !"
  8. set "str=!str:%$:~0x02,1%= !"
  9. set "str=!str:%$:~0x03,1%= !"
  10. set "str=!str:%$:~0x1E,1%= !"
  11. set "str=!str:%$:~0x04,1%= !"
  12. set "str=!str:%$:~0x05,1%= !"
  13. set str=!str:-=m!
  14. for %%A in (!str!) do (
  15. set/a _%%A+=1
  16. if !_%%A! GEQ 3 (echo %%A 出现!_%%A!次&echo gtr 3 wait del is ...&echo.)
  17. )))
  18. :end ==============================================================
  19. endlocal&echo 按任意键退出&pause>nul
复制代码
你先测试一下
'dir /a-d/b *.dat'  可以改成'dir /a-d/b/s *.dat' 以搜索子文件夹

由于有Hex字符,打个包吧, 额又占用论坛资源了.
1

评分人数

    • playinthesky: 高手,我都不知道怎么弄,谢谢你~!技术 + 1
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

我去找ascmap.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

回复 13# hfg1977


    全部是用草花分隔的,有很多很多个文件,就是要将草花内的内容统计,遇到重复的内容统计,单个文件内出现3个一样或更多的,就将此文件删除,最后剩下的文件都是在草花间隔内的内容不相同的,或者说出现小于3的。

我就是计数器弄不好,无法让计数器在处理完一个文件之后,重新计数和删除,单个文件大致我是这样写的,但是需要判断 3+的话,将重复出现3+的文件删除。
  1. @echo off&setlocal enabledelayedexpansion
  2. call ascmap $
  3. for %%a in (1.dat) do (
  4.   for /f "usebackq delims= tokens=4 " %%b in ("%%a") do (
  5.     set "str=%%b"
  6.     set "str=!str:%$:~0x01,1%=!"
  7.     set "str=!str:%$:~0x02,1%=!"
  8.     set "str=!str:%$:~0x03,1%=!"
  9.     set "str=!str:%$:~0x1E,1%=!"
  10.     set "str=!str:%$:~0x04,1%= !"
  11.     set "str=!str:%$:~0x05,1%= !"
  12.     set "str=!str:%$:~0x2D,1%=!"
  13.       for %%i in (!str!) do (
  14.         set/a _%%i+=1
  15.         echo %%i 出现 !_%%i!次
  16.       )
  17.    )
  18. )
  19. pause
复制代码

TOP

你要处理的文件很多,且都是如上传文件类似用"草花"分隔的?
这个要问清,不然没法写code.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

回复 10# hfg1977


    怎么清空变量?

TOP

回复 10# hfg1977


    不会,真的不会,将计数器统计一个文件之后清空,还有就是没清空之前计算好,大于三个的文件删除如何写代码。请明示吧,谢谢你了!!

TOP

  1. set str=!str:-=m!
  2. for %%A in (!str!) do (
  3. set/a _%%A+=1
  4. ...
复制代码
要把 "str'中的"运算符号"替换掉, 不然for中的 "set/a"计算会出错
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

因为计数不会按照每个dat文件统计,所以删除出现内容重复的dat 也是错误的,是否能发现每个dat文件出现重复数超过3+的时候删除


当然可以, 每处理完一个文件把变量清空.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

回复 4# hfg1977
  1. @echo off&setlocal enabledelayedexpansion
  2. call ascmap $
  3. for %%a in (1.dat) do (
  4.   for /f "usebackq delims= tokens=* " %%b in ("%%a") do (
  5.     set "str=%%b"
  6.     set "str=!str:%$:~0x01,1%=!"
  7.     set "str=!str:%$:~0x02,1%=!"
  8.     set "str=!str:%$:~0x03,1%=!"
  9.     set "str=!str:%$:~0x1E,1%=!"
  10.     set "str=!str:%$:~0x04,1%= !"
  11.     set "str=!str:%$:~0x05,1%= !"
  12.     set "str=!str:%$:~0x2D,1%=!"
  13.       for %%i in (!str!) do (
  14.         set/a _%%i+=1
  15.         echo %%i 出现 !_%%i!次
  16.      if !_%%i! gtr 3 del %%a
  17.       )
  18.   )
  19. )
  20. pause
复制代码
但是如果用 *.dat 的话,因为计数不会按照每个dat文件统计,所以删除出现内容重复的dat 也是错误的,是否能发现每个dat文件出现重复数超过3+的时候删除,你之前理解的意思是正确的!!大哥

TOP

回复 2# CrLf


    感谢您的思路,我再试试看!

TOP

返回列表