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

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

請教各位好心的前輩幫忙

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

以∥作為分隔符

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

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

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

請問該如何作呢?謝謝

放在文本文件同目录下执行,生成新文件 new_原文件名.txt
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir/b *.txt') do (
  4.  for /f "usebackq skip=1 tokens=1-3* delims=/" %%j in ("%%i") do (
  5.   if not exist "new_%%i" (
  6.    set/p first=<"%%i"
  7.    echo !first!>"new_%%i"
  8.   )
  9.   echo %%j//%%k//?//%%m>>"new_%%i"
  10.  )
  11. )
  12. pause
复制代码

TOP

給樓上的前輩

我使用您的代碼後

替換的是F的內容

但是我要替換的是C的內容

請問該怎麼作呢?

感謝您!

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir/b *.txt') do (
  4.  for /f "usebackq skip=1 tokens=1-3* delims=∥" %%j in ("%%i") do (
  5.   if not exist "new_%%i" (
  6.    set/p first=<"%%i"
  7.    echo !first!>"new_%%i"
  8.   )
  9.   echo %%j∥%%k∥?∥%%m>>"new_%%i"
  10.  )
  11. )
  12. pause
复制代码

啊是我搞錯了

前輩您沒寫錯

我修改正確的分隔符就可以了

感謝

TOP

不好意思前輩,再麻煩您

問題一:
請問我要在這些文本中,只要每行有出現<<錯誤>>這個字符,就直接將該行刪除

問題二:
只要文本內其中有一行,不符合十二個∥分隔符,就將該文本移動到別的文件夾

請問該如何寫呢?

感謝!

TOP

用findstr配合。。。
用sed等第三方工具方便吧,用for做太麻烦了。。。

TOP

原帖由 defanive 于 2009-1-25 23:26 发表
用findstr配合。。。
用sed等第三方工具方便吧,用for做太麻烦了。。。

不太瞭解您所講的

請問該怎麼使用呢?

小弟這方面還沒學習過

因為網站的資料要處理,經過友人推薦來此討教

希望給新手多包含指點

TOP

另外請教wxcute版主

您給我的代碼,只要處理文本內含有 "!"  "?"  ":"  "<"  字符,就會跳過不處理

請問要如何忽略過這些字符正常處理呢?

謝謝

TOP

使用前请备份,以免数据丢失。还有可以先用部分数据测试。
其中 “Tmp_原名” 为中间文件,即去掉含 “错误” 字符串的行,因为无法整合处理,所以改用临时文件。
“new_原名” 为最终生成文件。
  1. @echo off
  2. echo 使用前请先备份好数据……
  3. echo 备份好后按任意键开始。
  4. pause>nul
  5. if not exist Not12\ md Not12
  6. for /f "delims=" %%X in ('dir/b *.txt') do (
  7.  set flag=
  8.  call :wordErr "%%X"
  9.  call :judge12 "Tmp_%%X"
  10.  if not defined flag for /f "usebackq skip=1 tokens=1-12* delims=∥" %%a in ("Tmp_%%X") do (
  11.   if not exist "new_%%X" call :firstL "%%X"
  12.   echo %%a∥%%b∥?∥%%d∥%%e∥%%f∥%%g∥%%h∥%%i∥%%j∥%%k∥%%l>>"new_%%X"
  13.  )
  14. )
  15. pause
  16. :firstL
  17.  set/p first=<%1
  18.  echo %first%>"new_%~1"
  19.  goto :eof
  20. :judge12
  21.  for /f "usebackq skip=1 tokens=1-12* delims=∥" %%a in (%1) do (
  22.   if "%%l"=="" set flag=1
  23.   if not "%%m"=="" set flag=1
  24.  )
  25.  if defined flag move "%~1" Not12
  26.  goto :eof
  27. :wordErr
  28.  cd.>"Tmp_%~1"
  29.  for /f "delims= eol=" %%i in ('findstr /v "<<錯誤>>" %1') do (
  30.   echo+%%i>>"Tmp_%~1"
  31.  )
复制代码

TOP

原帖由 wxcute 于 2009-1-27 11:32 发表
使用前请备份,以免数据丢失。还有可以先用部分数据测试。
其中 “Tmp_原名” 为中间文件,即去掉含 “错误” 字符串的行,因为无法整合处理,所以改用临时文件。
“new_原名” 为最终生成文件。@echo off
echo 使 ...

抱歉

過年期間回老家一直沒能上來答覆

我試用了您的代碼後

發現沒有生成new文件

也就是?字符沒有進行替換

請問是為什麼呢?

感謝!

TOP

未测试。。
建议给出样本文件
仍有几个疑问
如你5楼所说。
只要文本內其中有一行,不符合十二個∥分隔符,就將該文本移動到別的文件夾
对于此句中的 “不符合十二個∥分隔符” 我有多个理解。
1、∥∥∥∥∥∥∥∥∥∥∥∥abcd∥ 这算有12个吗?
2、∥1∥2∥3∥4∥5∥∥∥∥6∥7∥8∥9∥10∥11∥ 这算有12个吗?
以下代码对 “符合十二個∥分隔符” 的定义是:
1、连续的∥算作一个
2、每行首尾的∥被忽略。
3、不足12个∥的就將該文本移動到別的文件夾,但多于12个的则不会。
代码未测试,并会改写源文件,测试前勿必作备份。。。切记!!!
:
  1. @echo off
  2. md sss
  3. for /f "delims=" %%A in ('dir/b *.txt') do (
  4.    cd.>xx.txt
  5.    set var=&set flag=a
  6.    for /f "tokens=1-3* delims=∥" %%a in ('findstr /iv "錯誤" "%%A"') do (
  7.       >>xx.txt echo %%a∥%%b∥?∥%%d
  8.       for /f "tokens=13 delims=∥" %%B in ("%%a∥%%b∥?∥%%d") do set "flag="
  9.       if defined flag set var=a
  10.    )
  11.    if defined var move "%%A" "sss"&del/q xx.txt
  12.    if exist xx.txt move "xx.txt" "%%A"
  13. )
  14. pause
复制代码
技术问题请到论坛发帖求助!

TOP

  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. exit
  5. :lp
  6. for /f "tokens=1-12* delims=∥" %%a in ('findstr /iv "<<錯誤>>" %1') do (
  7. if "%%l"=="" (move %1 "Not12\%~1"& del "Not12\new_Tmp_%~1" 2>nul&exit/b)else (
  8. >>"new_Tmp_%~1" echo %%a∥%%b∥?∥%%d∥%%e∥%%f∥%%g∥%%h∥%%i∥%%j∥%%k∥%%l∥
  9. ))
复制代码

TOP

原帖由 随风 于 2009-1-29 01:30 发表
未测试。。
建议给出样本文件
仍有几个疑问
如你5楼所说。
只要文本內其中有一行,不符合十二個∥分隔符,就將該文本移動到別的文件夾
对于此句中的 “不符合十二個∥分隔符” 我有多个理解。
1、∥∥∥∥∥∥ ...

我測試過您的代碼

不太合理@@

我需求的是:

1:先進行?字符先取代

2:接著要完全符合12個∥分隔符,多或少都不能

謝謝你的答覆^^

以下幾個範本供您測試



[ 本帖最后由 leo1984 于 2009-1-29 03:52 编辑 ]

TOP

原帖由 terse 于 2009-1-29 01:47 发表
@echo off
if not exist Not12\ md Not12
for /f "delims=" %%i in ('dir/b /a-d *.txt') do call :lp "%%i"
exit
:lp
for /f "tokens=1-12* delims=∥" %%a in ('findstr /iv "" %1') do (
if "%%l"=="" (mov ...

前輩
沒想到在這裡也看到您

真是熱心的人

在這跟你拜個年~~祝 健康順心

我測試您的代碼後

not12文件夾內的都是符合12個∥分隔符的文本

並且沒有進行?字符的取代

是不是處理方式搞反了呢?

謝謝

[ 本帖最后由 leo1984 于 2009-1-29 03:57 编辑 ]

TOP

问题一、样本没有含 “错误” 字样的行
  二、样本中没有非 12 个分隔符的行

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

以下代码不能处理一行中引号数为单数的情况。
  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 delims=" %%i in ("Tmp_%%X") do (
  7.   call :judge12 "%%i"
  8.  )
  9.  if defined flag move "Tmp_%%X" Not12
  10.  if not defined flag for /f "usebackq tokens=1-3* delims=‖" %%a in ("Tmp_%%X") do (
  11.   if exist "new_%%X" (
  12.    echo %%a‖%%b‖?‖%%d>>"new_%%X"
  13.   ) else echo %%a‖%%b‖%%c‖%%d>"new_%%X"
  14.  )
  15. )
  16. pause
  17. :judge12
  18.  set n=
  19.  set contain=%1
  20. :lp
  21.  set contain=%contain:*‖="%
  22.  set/a n+=1
  23.  if %n% lss 12 (
  24.   if %contain%=="" set flag=1
  25.   goto :lp
  26.  )
  27.  if not %contain%=="" set flag=1
  28.  goto :eof
  29. :wordErr
  30.  cd.>"Tmp_%~1"
  31.  for /f "delims= eol=" %%i in ('findstr /v "\<\<錯誤>>" %1') do (
  32.   echo+%%i>>"Tmp_%~1"
  33.  )
复制代码

TOP

返回列表