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

[文本处理] [已解决]批处理把以双竖线为分隔符,把指定列替换成问号

請教各位好心的前輩幫忙

我有一個文件夾,裡頭有許多txt文本,全部都要處理

以∥作為分隔符

我想要在文本第一行后面的每一行作處理

a∥b∥c∥d∥e∥f∥g∥h∥i∥j∥k∥l∥

我想要將c的部份用  "?" 符號取代

請問該如何作呢?謝謝

原帖由 wxcute 于 2009-2-3 19:40 发表
我在 25 楼也有提到,有些 12 个分隔符的被判断错是因为感叹号的缘故。

以下能处理 17 个分开的感叹号。再多的话就得换个思路处理这个符号了。@echo off
if not exist Not12\ md Not12
for /f "delims=" %%X in ...

可以用了

感謝版主用心不厭其煩的教導

好心有好報,希望前輩能更上層樓

TOP

我在 25 楼也有提到,有些 12 个分隔符的被判断错是因为感叹号的缘故。

以下能处理 17 个分开的感叹号。再多的话就得换个思路处理这个符号了。
  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-17* delims=!" %%i in ("Tmp_%%X") do (
  8.   set txtL=%%i%%j%%k%%l%%m%%n%%o%%p%%q%%r%%s%%t%%u%%v%%w%%x%%y%%z
  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.  )
复制代码

[ 本帖最后由 wxcute 于 2009-2-3 19:43 编辑 ]

TOP

原帖由 terse 于 2009-2-2 15:14 发表


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


前輩

文本的處理上都沒有問題了

但是有部份文本會多出一行只留下var字符


請問是哪裡錯誤了呢?

再煩請提點,感謝再感謝

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

TOP

原帖由 wxcute 于 2009-2-2 12:31 发表
代码更新,请测试@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  ...

多次麻煩

感謝萬分

我剛測試您代碼,有符合12個∥的文本,也被移到NOT12文件夾裡

請問是為什麼呢? 謝謝!

以下是被移到NOT12文件夾的文本範例

TOP

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

謝謝您的幫忙

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

請問可以再修正嗎?


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

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

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

TOP

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


1:是為分隔符

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

2:含有 <<错误>>的

3:一個字符就算一個

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

TOP

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

前輩我試用您的代碼後

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

請問是哪裡有錯誤呢?

謝謝

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

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

心在天山,身老沧州。

TOP

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

心在天山,身老沧州。

TOP

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

謝謝您的幫忙

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

請問可以再修正嗎?

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

返回列表