Board logo

标题: [文本处理] 批处理如何判断每行开头字符并在最前面添加对应字符? [打印本页]

作者: wh123wh123    时间: 2023-2-25 20:35     标题: 批处理如何判断每行开头字符并在最前面添加对应字符?

本帖最后由 wh123wh123 于 2023-2-25 21:11 编辑

批处理如何判断文本文件A.txt里每行开头字符是否为关键词词并在其最前面添加对应的字符?
当该行内容最前面的字符为"FD"则在前面添加字符“8”
当该行内容最前面的字符为"k"则在前面添加字符“90”
当该行内容最前面的字符为“4”则在前面添加字符“0”,
当该行内容最前面的字符为“04”则在前面添加字符“0”,
例如A.txt内容如下:
4士大夫0   幅度是否      39239 23
FDDsdfsdf 分割地方 23232    4343443
0483728281922 33 401 0.9
KKJEsW 23  543123 554
处理并输出到B.txt后如下:
04士大夫0   幅度是否      39239 23
8FDDsdfsdf 分割地方 23232    4343443
00483728281922 33 401 0.9
90KKJEsW 23  543123 554
求完整批处理代码,谢谢老师
作者: 77七    时间: 2023-2-25 21:47

  1. @echo off
  2. for /f "delims=" %%a in ('type "A.txt"^| findstr /n .*') do (
  3. set "str=%%a"
  4. setlocal enabledelayedexpansion
  5. set "str=!str:*:=!"
  6. set n=
  7. if /i "!str:~0,2!" equ "FD" (
  8. set n=1 & echo 8!str!
  9. )
  10. if /i "!str:~0,1!" equ "k" (
  11. set n=1 & echo 90!str!
  12. )
  13. if /i "!str:~0,1!" equ "4" (
  14. set n=1 & echo 0!str!
  15. )
  16. if /i "!str:~0,2!" equ "04" (
  17. set n=1 & echo 0!str!
  18. )
  19. if not defined n echo,!str!
  20. endlocal
  21. )>>B.txt
  22. pause
复制代码

作者: qixiaobin0715    时间: 2023-2-26 09:16

本帖最后由 qixiaobin0715 于 2023-2-26 10:03 编辑

2楼代码已解决,试试别的思路。纯属练手,不必评分。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a #k=90,#4=0,#FD=8,#04=0
  4. (for /f "delims=" %%i in (A.txt) do (
  5.     set str=%%i
  6.     set str1=#!str:~,1!
  7.     set str2=#!str:~,2!
  8.     set /a "num1=#!str:~,1!","num2=#!str:~,2!"
  9.     if defined !str2! (
  10.         echo,!num2!%%i
  11.     ) else if defined !str1! (
  12.         echo,!num1!%%i
  13.     ) else (
  14.         echo,%%i
  15.     )
  16. ))>B.txt
  17. pause
复制代码

作者: qixiaobin0715    时间: 2023-2-27 16:11

世上哪有完全通用的东西?具体问题具体分析而已。上面代码只是对要添加的字符是数字才有用,否则就要想别的办法。
作者: Batcher    时间: 2023-2-27 16:26

回复 2# 77七


    改成 if ... else if ... 可以减少重复执行的次数
作者: 77七    时间: 2023-2-27 18:53

本帖最后由 77七 于 2023-2-27 18:56 编辑

回复 5# Batcher


   谢谢站长指点!
  1. @echo off
  2. for /f "delims=" %%a in ('type "A.txt"^| findstr /n .*') do (
  3.         set "str=%%a"
  4.         setlocal enabledelayedexpansion
  5.         set "str=!str:*:=!"
  6.         if /i "!str:~0,2!" equ "FD" (
  7.                 echo 8!str!
  8.         ) else if /i "!str:~0,1!" equ "k" (
  9.                 echo 90!str!
  10.         ) else if /i "!str:~0,1!" equ "4" (
  11.                 echo 0!str!
  12.         ) else if /i "!str:~0,2!" equ "04" (
  13.                 echo 0!str!
  14.         ) else (
  15.                 echo,!str!
  16.         )
  17.         endlocal
  18. )>>B.txt
  19. pause
复制代码

作者: aloha20200628    时间: 2023-2-27 22:56

本帖最后由 aloha20200628 于 2023-2-27 23:40 编辑

头部字段要适应不同字符和不同位数,须先建立一个类似字典的数表,如脚本代码中的listH变量值
其字典表结构:头部字段#前缀字段#头部字段位数 ...
其中分隔符#可选不常用的字符,但不能是for-in()默认的分隔符(空格逗号分号)
试试吧...
  1. @echo off
  2. set "listH=4#0#1 FD#8#2 04#0#2 K#90#1"
  3. setlocal enabledelayedexpansion
  4. (for /f "delims=" %%s in (a.txt) do (
  5.     set "str=%%s" &set "got=0"
  6.     for %%F in (%listH%) do (
  7.         for /f "tokens=1-3 delims=#" %%1 in ("%%~F") do (
  8.            if "!str:~,%%3!"=="%%1" (set "got=1" &echo,%%2%%s)
  9.         )
  10.     )
  11.     if !got! equ 0 (echo,%%s)
  12. ))>b.txt
  13. endlocal &exit/b
复制代码

作者: aloha20200628    时间: 2023-2-27 23:45

备注》7楼代码已订正。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2