标题: [文本处理] 【已解决】如何利用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
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in (歌手.txt) do (
- set "str=%%i"
- set "s=!str:~,1!"
- if !s! leq 9 for /f "tokens=* delims=0123456789" %%a in ("%%i") do (
- set "t=!str!"
- for /l %%d in (0,1,9) do set "t=!t:%%d=!"
- if "%%a" == "!t!" set "str=@@%%i"
- )
- echo;!str!
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2021-1-11 09:36
本帖最后由 qixiaobin0715 于 2021-1-11 09:39 编辑
回复 1# toyerspollors
不需要用什么文本分割器,直接批就可以啊:- @echo off
- set n=false
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (歌手.txt) do (
- set "str=%%a"
- 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!
- )
- pause
复制代码
作者: 路过 时间: 2021-1-11 09:54
- @echo off
- pushd "%~sdp0"
- setlocal enabledelayedexpansion
- for /l %%a in (0,1,9) do (set .%%a=1)
- (for /f "delims=" %%a in (歌手.txt) do (
- set q=%%a
- set w=!q:~0,1!
- if defined .!w! (echo;@@%%a) else (echo;%%a)
- ))>歌手2.txt
- 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
未测试,自己试试看看还有什么问题:- @echo off
- set n=false
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (歌手.txt) do (
- 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!
- )
- 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 - @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1*delims=:" %%h in ('findstr /in .* 歌手.txt') do (
- set "str=%%i"
- set "s=!str:~,1!"
- if !s! leq 9 for /f "tokens=* delims=0123456789" %%a in ("%%i") do (
- set "t=!str!"
- for /l %%d in (0,1,9) do set "t=!t:%%d=!"
- if "%%a" == "!t!" set "str=@@%%i"
- )
- echo;!str!
- ))>2.txt
- 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的代码- @echo off
- setlocal enabledelayedexpansion
- pushd "%~sdp0"
- for /f %%a in ('findstr /v "^^^$" "歌手1.txt" ^| find /c /v ""') do set line=%%a
- (
- for /l %%a in (1,1,%line%) do (set "q="
- set /p q=
- if "!q!"=="" (echo;) else (
- set w=!q:~0,1!
- if "!w!"=="第" (echo;@@!q!) else (echo;!q!)
- )
- )
- )<歌手1.txt>n歌手1.txt
- pause
复制代码
歌手2的代码- @echo off
- setlocal enabledelayedexpansion
- pushd "%~sdp0"
- for %%a in (一 二 三 四 五 六 七 八 九) do (set .%%a=1)
- for /f %%a in ('findstr /v "^^^$" "歌手2.txt" ^| find /c /v ""') do set line=%%a
- (
- for /l %%a in (1,1,%line%) do (set "q="
- set /p q=
- if "!q!"=="" (echo;) else (
- set w=!q:~0,1!
- if defined .!w! (echo;@@!q!) else (echo;!q!)
- )
- )
- )<歌手2.txt>n歌手2.txt
- pause
复制代码
作者: terse 时间: 2021-1-12 14:58
用途不明 不好写
作者: qixiaobin0715 时间: 2021-1-12 16:37
本帖最后由 qixiaobin0715 于 2021-1-12 22:50 编辑
这样直接分割文件效率高一点(适合顶楼的情况):- @echo off
- set n=0
- setlocal enabledelayedexpansion
- for /f "tokens=1,2* delims=: " %%a in ('findstr /r /n /c:"^ *[0-9][0-9]* " 歌手.txt') do (
- set /a n+=1
- set str=%%a
- set /a _!n!=!str: =!
- set "#!n!=%%b %%c"
- )
- set /a k=%_1%-1
- set m=1
- for /f "skip=%k% tokens=1* delims=:" %%i in ('findstr /n ".*" 歌手.txt') do (
- set /a x=_!m!
- if !x!==%%i (
- for %%d in (#!m!) do set "filename=!%%d!.txt"
- echo,%%j>>!filename!
- set /a m+=1
- ) else (
- echo,%%j>>!filename!
- )
- )
- 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个字符的 字符数可自定- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1*delims=:" %%h in ('findstr /in .* ^<歌手.txt') do (
- for /f "tokens=*" %%j in ("%%i") do (
- if "%%j" leq "9" if "%%j" gtr "0" for /f "delims=0123456789" %%a in ("%%j") do (
- set "a=%%a"
- set "t=%%j"
- for /l %%d in (0,1,9) do set "t=!t:%%d=!"
- if "!a!" == "!t!" if "!a:~10!" == "" set "file=%%j.txt"
- )
- )
- if defined file >>!file! echo;%%i
- )
- pause
复制代码
作者: 路过 时间: 2021-1-13 08:19
本帖最后由 路过 于 2021-1-13 08:23 编辑
一楼要的代码- @echo off
- setlocal enabledelayedexpansion
- pushd "%~sdp0"
- for /l %%a in (1,1,9) do (set .%%a=1)
- for /f %%a in ('findstr /v "^^^$" "歌手111.txt" ^| find /c /v ""') do set line=%%a
- (
- for /l %%a in (1,1,%line%) do (set "q="
- set /p q=
- if "!q!"=="" (echo;) else (
- for /f "tokens=*" %%b in ("!q!") do (set w=%%b
- set w=!w:~0,1!!w:~23,1!
- if defined .!w! (echo;@@%%b) else (echo;!q!)
- )
- )
- )
- )<歌手111.txt>n歌手111.txt
- pause
复制代码
作者: qixiaobin0715 时间: 2021-1-13 08:23
本帖最后由 qixiaobin0715 于 2021-1-13 09:01 编辑
确实像楼上老大所说的那样。其实处理文本不是批处理的强项,并且到处是雷。其它功能有时倒是挺方便。编辑文本文件还不如使用文本编辑器Notepad++、EE等,效率又高又容易操控。比如像本帖,用文本编辑器用一个简单的正则表达式就能解决问题:
打开替换选项卡——勾选使用正则表达式——搜索项填入:- ^\s*([0-9一二三四五六七八九零十百第章]+[ ])
复制代码
或更精确一点:- ^\s*(([0-9]+|第?[一二三四五六七八九零十百]+章?)[ ])
复制代码
替换项填入:复制代码
点击替换全部即可
作者: toyerspollors 时间: 2021-1-13 17:42
回复 27# qixiaobin0715
我还没有用过这样文本编辑器处理文本,过后尝试一下, 谢谢老师指点。
作者: toyerspollors 时间: 2021-1-13 17:59
谢谢各位老师指教。
本贴到此结束,过后慢慢消化学习。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |