[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

本帖最后由 playinthesky 于 2011-8-24 20:20 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. call ascmap $
  3. for  %%a in (*.dat) do (
  4.   for /f "delims=%$:~0x05,1% usebackq tokens=*" %%b in (%%a) do (
  5.     set "str=%%b"
  6.     set "str=!str:%$:~0x05,1%= !"
  7.     set "str=!str:-=^!"
  8.       for %%i in (!str!) do (
  9. if defined _%%i (set /a _%%i+=1
  10.         )  else (
  11.            set /a _%%i=1
  12.         )
  13.       )
  14.       for /f "tokens=1,2 delims=_=" %%j in ('set _') do echo 出现 %%k 的次数 %%p
  15.         if %%p gtr %%k del %%a
  16.    )
  17. )
  18. pause
复制代码
计数器很难调用,就是统计出现的数目,若是出现数目超过一定数目就将其文件删除,高手,帮帮我。

TOP

回复 4# hfg1977


    谢谢你的指点,我自己在去试试看,感到很难做到分开统计。

TOP

回复 2# CrLf


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

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

回复 10# hfg1977


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

TOP

回复 10# hfg1977


    怎么清空变量?

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

回复 16# hfg1977


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

TOP

回复 18# hfg1977


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

TOP

回复 18# hfg1977


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

TOP

返回列表