Board logo

标题: [文本处理] 【已解决】批处理如何能够随心所欲的换行? [打印本页]

作者: 屡败屡战    时间: 2018-7-15 16:32     标题: 【已解决】批处理如何能够随心所欲的换行?

本帖最后由 屡败屡战 于 2018-7-20 19:19 编辑

我有一个论坛大伽的代码,其功用是将当前文件夹下的N个txt文本文件中指定字符串“。”后面添加换行。
但是有个问题,就是文章经整理后,文章的段落划分的太多,太零散。不太适合浏览文章。
我想请大神们修改代码,最好可以每隔2个句号(或3个句号)就换行。
如果能间隔几个句号就换行,句号的个数可以由自己决定,最好请大绅们在代码中注明如何修改“句号”的个数。
便于曰后自己调整“句号”的个数。
我改了好久,效果不好,望论坛大绅们帮帮忙!!
  1. @echo off&setlocal enabledelayedexpansion
  2. md "%~dp0new" 2>nul
  3. for /f "delims=" %%a in ('dir /b *.txt') do (
  4.     (for /f "delims=" %%b in ('type "%%a"') do (
  5.         set "str=%%b"
  6.         echo !str:^。^=^。^
  7. !
  8.     ))>tmp
  9. more tmp>"new\%%a"&del tmp
  10. )
  11. echo 文件已保存在new文件夹&pause
复制代码




另外,还有个问题,上面这个代码是在“。”号之后换行的。
我想改成在“。”号之前就换行的,不知行不行?



老师好:我的电脑无法安装PowerShell,故无法执行PowerShell命令代码。我想求bat批处理代码。谢谢了!!
作者: xxpinqz    时间: 2018-7-15 18:15

  1. @echo off&setlocal enabledelayedexpansion
  2. md "%~dp0new" 2>nul
  3. set 句号=2
  4. for /f "delims=" %%a in ('dir /b *.txt') do (
  5.     set n=0
  6.     (for /f "delims=" %%b in ('type "%%a"') do (
  7.         set "str=%%b"
  8.         if not "!str:。=!"=="%%b" set/a n+=1
  9.         if !n!==%句号% (
  10.          echo,%%b&echo,&set n=0
  11.         ) else echo,%%b
  12.     ))>tmp
  13. more tmp>"new\%%a"
  14. )
  15. echo 文件已保存在new文件夹&del tmp&pause
复制代码

作者: 屡败屡战    时间: 2018-7-16 07:23

本帖最后由 屡败屡战 于 2018-7-16 10:03 编辑

老师,点击代码操作后,文档无任何反应,不能进行分段。不知咋回亊??
另外,请在代码旁白处注明:如何修改“。”号的个数


另外,还有个补充问题,上面这个代码是在“。”号之后换行的。
我想改成在“。”号之前就换行的,不知行不行?
作者: Batcher    时间: 2018-7-16 10:09

回复 1# 屡败屡战


第6行到第8行改成:
  1. echo !str:^。^=^
  2. ^。!
复制代码
可以实现在“。”号之前就换行
作者: WHY    时间: 2018-7-17 21:52

每 3 个句号换一次行
  1. PowerShell -c "dir *.txt | ForEach{$arr=(type $_) -replace '(?:[^。]*。){3}(?!$)', ('$&'+\"`r`n\"); sc ($_.Name + '.Log') -value $arr}"
复制代码
在句号之前换行:
  1. PowerShell -c "dir *.txt | ForEach{$arr=(type $_) -replace '((?:[^。]*。){2}[^。]*)。(?!$)', ('$1'+\"`r`n。\"); sc ($_.Name + '.Log') -v $arr}"
复制代码

作者: 屡败屡战    时间: 2018-7-18 09:58

老师好:我的电脑无法安装PowerShell,故无法执行PowerShell命令代码。我想求bat批处理代码。谢谢了!!
作者: yhcfsr    时间: 2018-7-18 13:07

本帖最后由 yhcfsr 于 2018-7-18 13:09 编辑

把问题发到群里来,你的问题还有些疑问之处.
如果按照WORD的段落定义,遇到换行才会分段.在BAT中,遇到换行符前,所有的字符都在一行.换句话说,按照WORD的说法,BAT中一行就是一段.
所以按2楼的逐行判断法,如果一行中有N个句号,则无法将这N个句号进行分割.极端的情况,如果全文只有一行,你将会无功而返.
作者: Batcher    时间: 2018-7-18 13:23

回复 6# 屡败屡战


    你的电脑是什么操作系统?
作者: 屡败屡战    时间: 2018-7-18 17:44

本帖最后由 屡败屡战 于 2018-7-18 17:48 编辑

楼上老师说得太好了,一针见血。我的文档就是这种情况,整篇文章就只有一行(标题行不算)
整篇文章看得我眼花,故求助。

另外我的电脑系统是win7 64位,不知咋搞的,安装PowerShell脚本,总是提示失败
作者: yhcfsr    时间: 2018-7-18 19:11

回复 9# 屡败屡战


精简系统很可能无法安装.正常系统WIN7,需要先安装.NET 4.5,然后才能安装升级补丁.
不过还是有些电脑无法运行MSU更新包,必须解压,用DISM命令来安装更新.  
我建议你加入论坛QQ群,方便交流,或者看我签名,加我QQ
作者: 屡败屡战    时间: 2018-7-18 19:24

那么能否将txt文本格式转换成word文件,从word文件替换方面想想办法
作者: yhcfsr    时间: 2018-7-18 20:47

本帖最后由 yhcfsr 于 2018-7-19 18:07 编辑

回复 11# 屡败屡战

如果只几个文本,参考5楼的的正则部分,用NOTEPAD++修改.
如果文件多,用以下脚本.保存为BAT
  1. @set @n=0/*&echo off&set "script=%~f0"
  2. dir /a-d/s/b *.txt|cscript -nologo -e:jscript "%script%"
  3. pause&exit /b */
  4. //脚本与要处理的文件放一起
  5. //脚本会处理目录中所有TXT文件
  6. var n=4;//设置每n个句号换一次行
  7. var fso=new ActiveXObject('scripting.FileSystemObject')
  8. while(!WSH.StdIn.AtEndOfStream){
  9. var file=WSH.StdIn.ReadLine();
  10. fo=fso.OpenTextFile(file,1);
  11. content=fo.ReadAll();
  12. var re =new RegExp("(?:[^。]*。){"+n+"}(?!$)","gim")
  13. content=content.replace(re,'$&\r\n')
  14. fo.close();
  15. fo=fso.OpenTextFile(file,2);
  16. fo.Write(content);
  17. fo.close();
  18. }
复制代码





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