返回列表 发帖
这样可以不
@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 (
   set "str=%%d"
   setlocal enabledelayedexpansion
   for /l %%i in (1 1 9) do (
   set "str=!str:*‖=!"
)
   if "!str!"=="" (
   endlocal
   >>"new_Tmp_%~1" echo %%a%%b‖?‖%%d
) else (
move %1 "Not12\%~1"& del "new_Tmp_%~1" 2>nul&exit/b
))COPY

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

这样呢?
@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') do (
   if not defined str (set str=%%i&>>"new_Tmp_%~1" echo %%a%%b%%c%%d)else (
   set "str=%%d"
   setlocal enabledelayedexpansion
   for /l %%i in (1 1 9) do (
   set "str=!str:*‖=!"
)
   if "!str!"=="" (
   endlocal
   >>"new_Tmp_%~1" echo %%a%%b‖?‖%%d
) else (
move %1 "Not12\%~1"& del "new_Tmp_%~1" 2>nul&exit/b
)))COPY

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为空有错出现  因为没有特征 所以只要前面有一个空 就判断不了是哪个
@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 "delims=" %%a in ('findstr /iv "<<錯誤>>" %1') do (
   if not defined str (set str=a&>"new_Tmp_%~1" echo %%a)else (
   set "str=%%a"&set "str1=%%a"
setlocal enabledelayedexpansion
   for /l %%i in (1 1 12) do (
   set "str=!str:*‖=!"
   if %%i equ 3 set var=!str!
)
   if "!str!"=="" (
   for /f "tokens=1-3* delims=‖" %%a in ("!str1!") do >>"new_Tmp_%~1" echo %%a%%b‖?‖!var!
   endlocal
) else (
   endlocal
   move %1 "Not12\%~1"& del "new_Tmp_%~1" 2>nul&exit/b
)))COPY

[ 本帖最后由 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 加长。
@echo off
if not exist Not12\ md Not12
for /f "delims=" %%X in ('dir/b *.txt') do (
 set flag=
 call :wordErr "%%X"
 for /f "usebackq skip=1 tokens=1-4* delims=!" %%i in ("Tmp_%%X") do (
  set txtL=%%i%%j%%k%%l%%m
  setlocal enableDelayedExpansion
  set txtL=!txtL:"=!
  call :judge12 "!txtL!"
  setlocal disableDelayedExpansion
 )
 if defined flag move "Tmp_%%X" Not12
 if not defined flag for /f "usebackq delims=" %%I in ("Tmp_%%X") do (
  for /f "usebackq tokens=1-3* delims=‖" %%a in ('%%I') do (
   if exist "new_%%X" (
    echo %%a%%b‖?‖%%d>>"new_%%X"
   ) else echo %%I>"new_%%X"
  )
 )
)
pause
goto :eof
:judge12
 set n=
 set contain=%1
:lp
 set contain=%contain:*‖="%
 set/a n+=1
 if %n% lss 12 (
  if %contain%=="" set flag=1
  goto :lp
 )
 if not %contain%=="" set flag=1
 goto :eof
:wordErr
 cd.>"Tmp_%~1"
 for /f "delims= eol=" %%i in ('findstr /v "<<删除>>" %1') do (
  echo+%%i>>"Tmp_%~1"
 )COPY

[ 本帖最后由 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

代码更新,请测试
@echo off
if not exist Not12\ md Not12
for /f "delims=" %%X in ('dir/b *.txt') do (
 set flag=
 call :wordErr "%%X"
 setlocal enableDelayedExpansion
 for /f "usebackq skip=1 tokens=1* delims=!" %%i in ("Tmp_%%X") do (
  set txtL=%%i%%j
  set txtL=!txtL:"=!
  call :judge12 "!txtL!"
 )
 if defined flag move "Tmp_%%X" Not12
 endlocal enableDelayedExpansion
 if exist "Tmp_%%X" for /f "usebackq delims=" %%I in ("Tmp_%%X") do (
  for /f "usebackq tokens=1-3* delims=‖" %%a in ('%%I') do (
   if exist "new_%%X" (
    echo %%a%%b‖?‖%%d>>"new_%%X"
   ) else echo %%I>"new_%%X"
  )
 )
)
pause
goto :eof
:judge12
 set n=
 set contain=%1
:lp
 set contain=%contain:*‖="%
 set/a n+=1
 if %n% lss 12 (
  if %contain%=="" set flag=1
  goto :lp
 )
 if not %contain%=="" set flag=1
 goto :eof
:wordErr
 cd.>"Tmp_%~1"
 for /f "delims= eol=" %%i in ('findstr /v "<<删除>>" %1') do (
  echo+%%i>>"Tmp_%~1"
 )COPY

TOP

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

謝謝您的幫忙

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

請問可以再修正嗎?


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

TOP

返回列表