找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29841|回复: 3

[文本处理] 批处理如何单个字符解析文本文档?

[复制链接]
发表于 2019-5-19 13:53:16 | 显示全部楼层 |阅读模式
背景:有个 KID 社某小说的剧本文件,剧本中角色名称在剧本中使用“【”和“】”包围。需要列出所有角色的名称。(单行可能会出现多个角色名称。剧本有多个文件。)
设想:使用 FOR 语句,单个字符判断。如果找到“【”符号,将从“【”(被找到的)开始单个字符判断并写入到变量,如果找到“】”符号则停止。当搜索完毕后所有角色名称删除重复对象。
草稿:
  1. @echo off
  2. for /f "delims=" %%a in (整个剧本.txt) do (
  3.         for /l %%b in (1,0,1) do (
  4.                 set c=%%b
  5.                 set /a d=c+1
  6.                 echo %%b
  7.                 echo %c%
  8.                 echo %d%
  9.         )
  10. )
复制代码
测试时遇到问题,第 4 行似乎执行错误,因为第 4 行错误导致第五行不能正常执行,第 7 行和第 8 行回显”ECHO 处于关闭状态“。
这样我就无法在嵌套 FOR /L 中获取取当前数值了。
简单来说我就是想把所有文本文档的正文中所有用【】包围的内容写入到另一个文件,每行一项。并删除重复项。
发表于 2019-5-19 14:13:45 | 显示全部楼层
本帖最后由 zaqmlp 于 2019-5-19 14:35 编辑
  1. @echo off
  2. mode con lines=1000
  3. set info=互助互利,支付宝扫码头像,感谢赞助
  4. rem 有问题,可加QQ956535081及时沟通
  5. title %info%
  6. cd /d "%~dp0"
  7. powershell -NoProfile -ExecutionPolicy bypass ^
  8.     [System.Collections.ArrayList]$s=@();^
  9.     dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.txt')}^|%%{^
  10.         $text=[IO.File]::ReadAllText($_.FullName, [Text.Encoding]::Default);^
  11.         $m=[regex]::matches($text,'【[^^】]+】');^
  12.         write-host ('---------'+$_.Name+'---------');^
  13.         $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  14.         foreach($it in $m){^
  15.             if(-not $dic.ContainsKey($it.value)){^
  16.                 write-host $it.value;^
  17.                 $dic.Add($it.value,'');^
  18.                 [void]$s.add($it.value);^
  19.             };^
  20.         };^
  21.     };^
  22.     write-host '=============total=============';^
  23.     $ss=@($s^|sort^|get-unique);$ss;^
  24.     [IO.File]::WriteAllLines('$total.log', $ss, [Text.Encoding]::Default);^
  25.     write-host '%info%' -ForegroundColor green;
  26. pause
复制代码
发表于 2019-5-19 14:28:37 | 显示全部楼层
发表于 2019-5-19 18:05:38 | 显示全部楼层
开启变量延迟扩展试试
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (整个剧本.txt) do (
  4.     for /l %%b in (1,0,1) do (
  5.         set c=%%b
  6.         set /a d=c+1
  7.         echo %%b
  8.         echo !c!
  9.         echo !d!
  10.     )
  11. )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 02:22 , Processed in 0.014996 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表