Board logo

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

作者: toyerspollors    时间: 2021-1-10 21:56     标题: 【已解决】如何利用bat在txt文本中添加特定字符,求学习!

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

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

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

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

添加了特定的字符后,我想利用分割文本工具对文本进行提取特定字符来分割文件。每个文件只介绍一个人物。
作者: Batcher    时间: 2021-1-10 22:27

回复 1# toyerspollors


    请找一个真实的文件压缩之后传上来以便测试代码。随意举例的文件,可能导致代码无法正常处理你真实的文件。
作者: toyerspollors    时间: 2021-1-10 22:46

在1楼已上传。。。。
作者: terse    时间: 2021-1-11 00:29

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i 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. )
  12. pause
复制代码

作者: qixiaobin0715    时间: 2021-1-11 09:36

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

回复 1# toyerspollors
不需要用什么文本分割器,直接批就可以啊:
  1. @echo off
  2. set n=false
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in (歌手.txt) do (
  5. set "str=%%a"
  6. for /f %%b in ("%%a") do echo %%b|findstr /be "[0-9][0-9]*">nul&&set n=true&&set "filename=!str: =!.txt"&&echo %%a>>!filename!||if !n!==true echo %%a>>!filename!
  7. )
  8. pause
复制代码

作者: 路过    时间: 2021-1-11 09:54

  1. @echo off
  2. pushd "%~sdp0"
  3. setlocal enabledelayedexpansion
  4. for /l %%a in (0,1,9) do (set .%%a=1)
  5. (for /f "delims=" %%a in (歌手.txt) do (
  6.     set q=%%a
  7.     set w=!q:~0,1!
  8.     if defined .!w! (echo;@@%%a) else (echo;%%a)
  9. ))>歌手2.txt
  10. pause
复制代码

作者: netdzb    时间: 2021-1-11 09:56

回复 1# toyerspollors


文本分割工具可以传百度云吗?
作者: loveforjg    时间: 2021-1-11 10:00

批处理如何区分数字是序号还是介绍中的数字呢?
感觉用VBS的正则式更简单,特点就是数字开头为识别就好了
作者: toyerspollors    时间: 2021-1-11 10:29

谢谢各位老师指导,我先测试学习一下。。。。。。。
作者: toyerspollors    时间: 2021-1-11 19:01

回复 6# 路过


修改成功导出后歌手2.txt,我打开后看到文本里面的空行不见了,如果我想保留空行的话该修改什么地方的代码呢?

另外如果文本中的序号是以下这两种类型,该如何编写bat?请老师指教!
第一章   李玟
第二十章 沙宝亮
第二百五十一章    尚雯婕

一   李玟
二十 沙宝亮
二百五十一    尚雯婕
作者: toyerspollors    时间: 2021-1-11 19:05

回复 4# terse

老师,你这个只在终端显示结果,不能将结果保存为新文件呢。能修改一下吗?另外我也想保留文本中的空行。
作者: toyerspollors    时间: 2021-1-11 19:12

回复 5# qixiaobin0715

老师这个厉害,直接帮分割了,就是分割出来的文件命名,能不能在序号后面加1-2个空格呢?如:1  李玟.txt

还有我发现了一个问题,文本中1  李玟这种空格字符的就能分割,如果是1 李玟这种空格字符的话是不能分割出来的,不知道需要修改什么地方的代码,请老师帮处理一下,谢谢!
作者: qixiaobin0715    时间: 2021-1-11 20:52

回复 12# toyerspollors
未测试,自己试试看看还有什么问题:
  1. @echo off
  2. set n=false
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in (歌手.txt) do (
  5. for /f "tokens=1* delims=  " %%b in ("%%a") do echo %%b|findstr /be "[0-9][0-9]*">nul&&set n=true&&set "filename=%%b %%c.txt"&&echo %%a>>!filename!||if !n!==true echo %%a>>!filename!
  6. )
  7. pause
复制代码

作者: qixiaobin0715    时间: 2021-1-11 21:06

回复 10# toyerspollors
第一种情况修改13楼代码:findstr /r "^第.*章$">nul试试。第二种自己琢磨。
作者: qixiaobin0715    时间: 2021-1-11 21:54

实际上10楼第二种可以写一个非精确的代码,只是写出来太难看了,不好意思拿出来,还是期待高手吧。
作者: qixiaobin0715    时间: 2021-1-11 22:35

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

对自己的代码还不是太满意,速度慢效率低。还是等高手出来解决吧。
楼主能不能发一个完整的样本,不要节选的,便于测试。
作者: terse    时间: 2021-1-11 22:59

本帖最后由 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
复制代码

作者: WHY    时间: 2021-1-11 23:13

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

建议把你的需求写清晰点
作者: 路过    时间: 2021-1-12 14:55

本帖最后由 路过 于 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
复制代码

作者: terse    时间: 2021-1-12 14:58

用途不明 不好写
作者: qixiaobin0715    时间: 2021-1-12 16:37

本帖最后由 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
复制代码

作者: toyerspollors    时间: 2021-1-12 22:06

回复 22# qixiaobin0715

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

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

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

1   李玟
  56    尚雯婕
作者: qixiaobin0715    时间: 2021-1-12 23:07

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

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
复制代码

作者: 路过    时间: 2021-1-13 08:19

本帖最后由 路过 于 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
复制代码

作者: qixiaobin0715    时间: 2021-1-13 08:23

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

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

回复 27# qixiaobin0715


我还没有用过这样文本编辑器处理文本,过后尝试一下, 谢谢老师指点。
作者: toyerspollors    时间: 2021-1-13 17:59

谢谢各位老师指教。

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




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