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

[文本处理] 【已解决】如何利用bat在txt文本中添加特定字符,求学习!

还有一点小问题,已重新上传文本附件

文本内容里面介绍每个人物都有一个带有数字序号的小主题,如下,但是红色字体的序号前面是带有空格的,这些序号不是在行列的第一个字符位置,我测试了大家bat,都是无法识别到红色字体的这些序号,
1   李玟
     xxxx
2 沙宝亮
   xxxxxxx
  56    尚雯婕
    xxxxxxxx
177 陶喆
    xxxxxxxx
677 美国加利福尼亚
   xxxxxxxx

我想用批处理实现在数字序号前面加一个字符,如@@,最终效果为
@@1   李玟
     xxxx
@@2 沙宝亮
   xxxxxxx
@@56    尚雯婕
    xxxxxxxx
……

这个效果该如何编写bat代码...........只要添加字符的效果,不用写分割。

添加了特定的字符后,我想利用分割文本工具对文本进行提取特定字符来分割文件。每个文件只介绍一个人物。

谢谢各位老师指教。

本贴到此结束,过后慢慢消化学习。

TOP

回复 27# qixiaobin0715


我还没有用过这样文本编辑器处理文本,过后尝试一下, 谢谢老师指点。

TOP

本帖最后由 qixiaobin0715 于 2021-1-13 09:01 编辑

确实像楼上老大所说的那样。其实处理文本不是批处理的强项,并且到处是雷。其它功能有时倒是挺方便。编辑文本文件还不如使用文本编辑器Notepad++、EE等,效率又高又容易操控。比如像本帖,用文本编辑器用一个简单的正则表达式就能解决问题:
打开替换选项卡——勾选使用正则表达式——搜索项填入:
  1. ^\s*([0-9一二三四五六七八九零十百第章]+[  ])
复制代码
或更精确一点:
  1. ^\s*(([0-9]+|第?[一二三四五六七八九零十百]+章?)[  ])
复制代码
替换项填入:
  1. @@\1
复制代码
点击替换全部即可

TOP

本帖最后由 路过 于 2021-1-13 08:23 编辑

一楼要的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. pushd "%~sdp0"
  4. for /l %%a in (1,1,9) do (set .%%a=1)
  5. for /f %%a in ('findstr /v "^^^$" "歌手111.txt" ^| find /c /v ""') do set line=%%a
  6. (
  7.     for /l %%a in (1,1,%line%) do (set "q="
  8.         set /p q=
  9.         if "!q!"=="" (echo;) else (
  10.             for /f "tokens=*" %%b in ("!q!") do (set w=%%b
  11.                 set w=!w:~0,1!!w:~23,1!
  12.                 if defined .!w! (echo;@@%%b) else (echo;!q!)
  13.             )
  14.         )
  15.     )
  16. )<歌手111.txt>n歌手111.txt
  17. pause
复制代码

TOP

findstr判断也就那样  数字开头行 后面跟一句 还得再判断
排除了数字开头行后面超过10个字符的  字符数可自定
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1*delims=:" %%h in ('findstr /in .* ^<歌手.txt')  do (
  3.        for /f "tokens=*" %%j in ("%%i")  do (
  4.                if "%%j" leq "9" if "%%j" gtr "0" for /f "delims=0123456789" %%a in ("%%j")  do (
  5.                        set "a=%%a"
  6.                        set "t=%%j"
  7.                        for /l %%d in (0,1,9) do set "t=!t:%%d=!"
  8.                        if  "!a!" == "!t!" if "!a:~10!" == "" set "file=%%j.txt"
  9.                )
  10.        )
  11.        if defined file >>!file! echo;%%i
  12. )
  13. pause
复制代码

TOP

回复 23# toyerspollors
22楼代码已修改,可以解决分割标题前置空格问题。你提的条件越多效率就会下降的越多,建议用文本编辑器统一下格式,将全角空格替换为半角空格,再处理。

TOP

回复 22# qixiaobin0715

你这个比之前在13楼写的分割是快了很多。可惜不识别1 李玟这个空格字符。你之前在13楼写的就支持识别这种空格。

还有我发现一个问题,就是序号在每行第一个字符位置的就能识别分割,如果序号不在第一个字符位置,前面还有空格的话,就不能识别分割了。

我已把问题详细编辑到1楼了。

1   李玟
  56    尚雯婕

TOP

本帖最后由 qixiaobin0715 于 2021-1-12 22:50 编辑

这样直接分割文件效率高一点(适合顶楼的情况):
  1. @echo off
  2. set n=0
  3. setlocal enabledelayedexpansion
  4. for /f "tokens=1,2* delims=: " %%a in ('findstr /r /n /c:"^ *[0-9][0-9]* " 歌手.txt') do (
  5.     set /a n+=1
  6.     set str=%%a
  7.     set /a _!n!=!str: =!
  8.     set "#!n!=%%b %%c"
  9. )
  10. set /a k=%_1%-1
  11. set m=1
  12. for /f "skip=%k% tokens=1* delims=:" %%i in ('findstr /n ".*" 歌手.txt') do (
  13.     set /a x=_!m!
  14.     if !x!==%%i (
  15.         for %%d in (#!m!) do set "filename=!%%d!.txt"
  16.         echo,%%j>>!filename!
  17.         set /a m+=1
  18.     ) else (
  19.         echo,%%j>>!filename!
  20.     )
  21. )
  22. pause
复制代码

TOP

用途不明 不好写

TOP

本帖最后由 路过 于 2021-1-12 14:59 编辑

回复 10# toyerspollors
歌手1的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. pushd "%~sdp0"
  4. for /f %%a in ('findstr /v "^^^$" "歌手1.txt" ^| find /c /v ""') do set line=%%a
  5. (
  6.     for /l %%a in (1,1,%line%) do (set "q="
  7.         set /p q=
  8.         if "!q!"=="" (echo;) else (
  9.             set w=!q:~0,1!
  10.             if "!w!"=="第" (echo;@@!q!) else (echo;!q!)
  11.         )
  12.     )
  13. )<歌手1.txt>n歌手1.txt
  14. pause
复制代码
歌手2的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. pushd "%~sdp0"
  4. for %%a in (一 二 三 四 五 六 七 八 九) do (set .%%a=1)
  5. for /f %%a in ('findstr /v "^^^$" "歌手2.txt" ^| find /c /v ""') do set line=%%a
  6. (
  7.     for /l %%a in (1,1,%line%) do (set "q="
  8.         set /p q=
  9.         if "!q!"=="" (echo;) else (
  10.             set w=!q:~0,1!
  11.             if defined .!w! (echo;@@!q!) else (echo;!q!)
  12.         )
  13.     )
  14. )<歌手2.txt>n歌手2.txt
  15. pause
复制代码

TOP

建议把你的需求写清晰点

TOP

PowerShell "$arr=(gc 1.txt) -replace '^第[一二三四五六七八九零十百]+章\s+\S', '##$&'; sc 2.txt -Value $arr"

TOP

本帖最后由 terse 于 2021-1-12 00:15 编辑

回复 11# toyerspollors
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1*delims=:" %%h in ('findstr /in .* 歌手.txt')  do (
  3.      set "str=%%i"
  4.      set "s=!str:~,1!"
  5.      if !s! leq 9 for /f "tokens=* delims=0123456789" %%a in ("%%i")  do (
  6.             set "t=!str!"
  7.             for /l %%d in (0,1,9) do set "t=!t:%%d=!"
  8.             if  "%%a" == "!t!" set "str=@@%%i"
  9.     )
  10.     echo;!str!
  11. ))>2.txt
  12. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2021-1-11 22:39 编辑

对自己的代码还不是太满意,速度慢效率低。还是等高手出来解决吧。
楼主能不能发一个完整的样本,不要节选的,便于测试。

TOP

返回列表