[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
这样可以不
  1. @echo off
  2. if not exist Not12\ md Not12
  3. for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do call:lp "%%i"
  4. pause&exit
  5. :lp
  6. for /f "tokens=1-3* delims=‖" %%a in ('findstr /iv "<<錯誤>>" %1') do (
  7.    set "str=%%d"
  8.    setlocal enabledelayedexpansion
  9.    for /l %%i in (1 1 9) do (
  10.    set "str=!str:*‖=!"
  11. )
  12.    if "!str!"=="" (
  13.    endlocal
  14.    >>"new_Tmp_%~1" echo %%a‖%%b‖?‖%%d
  15. ) else (
  16. move %1 "Not12\%~1"& del "new_Tmp_%~1" 2>nul&exit/b
  17. ))
复制代码

TOP

原帖由 wxcute 于 2009-1-29 14:26 发表
问题一、样本没有含 “错误” 字样的行
  二、样本中没有非 12 个分隔符的行

  三、样本首行与其他行没什么区别

以下代码不能处理一行中引号数为单数的情况。@echo off
if not exist Not12\ md Not12
f ...

抱歉,过完年回来电脑被孩子玩坏,慢点回覆请多包含

前辈我使用您的代码后如下图,不能运行

另外我上传了两个错误的文本给您测试

第一个是含有错误的文本

第二个是含有少于十二个的文本

而因为这是网站的资料文本,第一行保留下来,是因为那是文章的标题,第二行以后就不需要文章标题,所以改用?字符禁止读取

麻烦您再帮忙

再次感谢您辛劳

TOP

原帖由 terse 于 2009-1-29 16:29 发表
这样可以不@echo off
if not exist Not12\ md Not12
for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do call:lp "%%i"
pause&exit
:lp
for /f "tokens=1-3* delims=‖" %%a in ('findstr /iv "" %1') do (
...

您的代碼是可以運行的

但是我需要忽略第一行,對其他行進行處理

我加入skip=1 好像也不行,會直接刪除第一行

可以麻煩您再修改嗎?

還有您上次在"非常批處理"網站給我的代碼
非常好用

再次感謝您!

TOP

这样呢?
  1. @echo off
  2. if not exist Not12\ md Not12
  3. for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do set "str="&call:lp "%%i"
  4. pause&exit
  5. :lp
  6. for /f "tokens=1-3* delims=‖" %%a in ('findstr /iv "<<錯誤>>" %1') do (
  7.    if not defined str (set str=%%i&>>"new_Tmp_%~1" echo %%a‖%%b‖%%c‖%%d)else (
  8.    set "str=%%d"
  9.    setlocal enabledelayedexpansion
  10.    for /l %%i in (1 1 9) do (
  11.    set "str=!str:*‖=!"
  12. )
  13.    if "!str!"=="" (
  14.    endlocal
  15.    >>"new_Tmp_%~1" echo %%a‖%%b‖?‖%%d
  16. ) else (
  17. move %1 "Not12\%~1"& del "new_Tmp_%~1" 2>nul&exit/b
  18. )))
复制代码

TOP

原帖由 terse 于 2009-1-31 13:23 发表
这样呢?@echo off
if not exist Not12\ md Not12
for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do set "str="&call:lp "%%i"
pause&exit
:lp
for /f "tokens=1-3* delims=‖" %%a in ('findstr /iv "" %1 ...

我剛才用您代碼測試

發現符合十二個分隔符的文本,也會被分類在Not12文件夾裡

我上傳一個文本供您測試

麻煩您

TOP

发现前面有空的值就会错误  先用下面试看了  不过那也不是办法  特征太少
%%a %%b为空有错出现  因为没有特征 所以只要前面有一个空 就判断不了是哪个
  1. @echo off
  2. if not exist Not12\ md Not12
  3. for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do set str=&call:lp "%%i"
  4. pause&exit
  5. :lp
  6. for /f "delims=" %%a in ('findstr /iv "<<錯誤>>" %1') do (
  7.    if not defined str (set str=a&>"new_Tmp_%~1" echo %%a)else (
  8.    set "str=%%a"&set "str1=%%a"
  9. setlocal enabledelayedexpansion
  10.    for /l %%i in (1 1 12) do (
  11.    set "str=!str:*‖=!"
  12.    if %%i equ 3 set var=!str!
  13. )
  14.    if "!str!"=="" (
  15.    for /f "tokens=1-3* delims=‖" %%a in ("!str1!") do >>"new_Tmp_%~1" echo %%a‖%%b‖?‖!var!
  16.    endlocal
  17. ) else (
  18.    endlocal
  19.    move %1 "Not12\%~1"& del "new_Tmp_%~1" 2>nul&exit/b
  20. )))
复制代码

[ 本帖最后由 terse 于 2009-2-2 15:05 编辑 ]

TOP

原帖由 terse 于 2009-2-1 13:52 发表
发现前面有空的值就会错误  先用下面试看了  不过那也不是办法  特征太少
%%a %%b为空有错出现  因为没有特征 所以只要前面有一个空 就判断不了是哪个@echo off
if not exist Not12\ md Not12
for /f "delims=" % ...

謝謝您的幫忙

不過我剛測試,每個文本的第一行後頭都會多加上∥%b∥%c∥%d這樣一段多餘的字符

請問可以再修正嗎?

TOP

  你的文字描述和你提供的文本有一些出入,所谓差之毫厘谬以千里,所以,有几个问题需要确认一下:
  1、分隔符号究竟是//还是‖?
  2、究竟是要删除含有 &lt;&lt;删除&gt;&gt; 字符串的行还是含有 &lt;&lt;错误&gt;&gt; 的行?
  3、多个‖连在一起算一个还是算多个?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  要消除每个文本第一行之后多出来的字符串,应该这样修改代码:在:lp的下一行添加一条语句 set "str="
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

条件总结如下:
一、先删除文本中包含 <<删除>> 字串的行;
二、处理一行为 12 个 ‖ 作为分隔符的文本,只要有一行不是 12 个分隔符,就放到一个单独的目录中;
  其中不考虑第一行,而且分隔符连续出现时分开算个数
三、将第三列替换为问号。
  其中头两列不为空


一行中的感叹号不能太多,多了就要将 set txtL=%%i%%j%%k%%l%%m 加长。
  1. @echo off
  2. if not exist Not12\ md Not12
  3. for /f "delims=" %%X in ('dir/b *.txt') do (
  4.  set flag=
  5.  call :wordErr "%%X"
  6.  for /f "usebackq skip=1 tokens=1-4* delims=!" %%i in ("Tmp_%%X") do (
  7.   set txtL=%%i%%j%%k%%l%%m
  8.   setlocal enableDelayedExpansion
  9.   set txtL=!txtL:"=!
  10.   call :judge12 "!txtL!"
  11.   setlocal disableDelayedExpansion
  12.  )
  13.  if defined flag move "Tmp_%%X" Not12
  14.  if not defined flag for /f "usebackq delims=" %%I in ("Tmp_%%X") do (
  15.   for /f "usebackq tokens=1-3* delims=‖" %%a in ('%%I') do (
  16.    if exist "new_%%X" (
  17.     echo %%a‖%%b‖?‖%%d>>"new_%%X"
  18.    ) else echo %%I>"new_%%X"
  19.   )
  20.  )
  21. )
  22. pause
  23. goto :eof
  24. :judge12
  25.  set n=
  26.  set contain=%1
  27. :lp
  28.  set contain=%contain:*‖="%
  29.  set/a n+=1
  30.  if %n% lss 12 (
  31.   if %contain%=="" set flag=1
  32.   goto :lp
  33.  )
  34.  if not %contain%=="" set flag=1
  35.  goto :eof
  36. :wordErr
  37.  cd.>"Tmp_%~1"
  38.  for /f "delims= eol=" %%i in ('findstr /v "<<删除>>" %1') do (
  39.   echo+%%i>>"Tmp_%~1"
  40.  )
复制代码

[ 本帖最后由 wxcute 于 2009-2-1 20:26 编辑 ]

TOP

原帖由 wxcute 于 2009-2-1 20:15 发表
条件总结如下:
一、先删除文本中包含  字串的行;
二、处理一行为 12 个 ‖ 作为分隔符的文本,只要有一行不是 12 个分隔符,就放到一个单独的目录中;
  其中不考虑第一行,而且分隔符连续出现时分开算个数
...

前輩我試用您的代碼後

出現如下圖的情況,而處理出來的文本始終保持四~五個

請問是哪裡有錯誤呢?

謝謝

TOP

原帖由 namejm 于 2009-2-1 19:15 发表
  你的文字描述和你提供的文本有一些出入,所谓差之毫厘谬以千里,所以,有几个问题需要确认一下:
  1、分隔符号究竟是//还是‖?
  2、究竟是要删除含有 <<删除>> 字符串的行还是含有 <<错误>> 的行?
  ...


1:是為分隔符

因為兩岸三地的繁簡編碼不同,我是用big5的繁體中文windows,所以文字上看起來會有差異

2:含有 <<错误>>的

3:一個字符就算一個

[ 本帖最后由 leo1984 于 2009-2-1 22:26 编辑 ]

TOP

高手辈出啊,而且能如此尽心答疑,真是网站幸事

TOP

代码更新,请测试
  1. @echo off
  2. if not exist Not12\ md Not12
  3. for /f "delims=" %%X in ('dir/b *.txt') do (
  4.  set flag=
  5.  call :wordErr "%%X"
  6.  setlocal enableDelayedExpansion
  7.  for /f "usebackq skip=1 tokens=1* delims=!" %%i in ("Tmp_%%X") do (
  8.   set txtL=%%i%%j
  9.   set txtL=!txtL:"=!
  10.   call :judge12 "!txtL!"
  11.  )
  12.  if defined flag move "Tmp_%%X" Not12
  13.  endlocal enableDelayedExpansion
  14.  if exist "Tmp_%%X" for /f "usebackq delims=" %%I in ("Tmp_%%X") do (
  15.   for /f "usebackq tokens=1-3* delims=‖" %%a in ('%%I') do (
  16.    if exist "new_%%X" (
  17.     echo %%a‖%%b‖?‖%%d>>"new_%%X"
  18.    ) else echo %%I>"new_%%X"
  19.   )
  20.  )
  21. )
  22. pause
  23. goto :eof
  24. :judge12
  25.  set n=
  26.  set contain=%1
  27. :lp
  28.  set contain=%contain:*‖="%
  29.  set/a n+=1
  30.  if %n% lss 12 (
  31.   if %contain%=="" set flag=1
  32.   goto :lp
  33.  )
  34.  if not %contain%=="" set flag=1
  35.  goto :eof
  36. :wordErr
  37.  cd.>"Tmp_%~1"
  38.  for /f "delims= eol=" %%i in ('findstr /v "<<删除>>" %1') do (
  39.   echo+%%i>>"Tmp_%~1"
  40.  )
复制代码

TOP

原帖由 leo1984 于 2009-2-1 16:00 发表

謝謝您的幫忙

不過我剛測試,每個文本的第一行後頭都會多加上∥%b∥%c∥%d這樣一段多餘的字符

請問可以再修正嗎?


去掉 echo %%a‖%%b‖%%c‖%%d      ‖%%b‖%%c‖%%d  只留echo %%a

TOP

返回列表