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

[文本处理] 再求批处理解决遇到--破折符号时,英文引号变为中文破折号。

[复制链接]
发表于 2024-3-12 08:58:30 | 显示全部楼层 |阅读模式
本帖最后由 dzwind 于 2024-3-28 16:15 编辑

首先感谢前一段时间名叫"aloha20200628"的大师给写一段想要的语句,对于我的日常重复提供大量的帮助。
由于我没有看懂这位大师的写法,所以我想再添加语句,不知该如何下手。
再求加入把英文破折号改为中文破折号,比如将--改为中文——破折号。
@echo off &setlocal enabledelayedexpansion
set file=%1\*.txt
for /f "delims=" %%F in ('dir/s/b/a-d %file%') do (
   set/a "pm=1,qm=1"
   (for /f "usebackq delims=" %%a in ("%%~F") do (
      set "s=%%a"&set "s=!s:......=……!"&set "_s=!s!"
      set "t=%%a"&set "t=!t:--=——!"&set "_t=!t!"   #这一句是我自己加的,但不起作用。
      for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
         if "!_s:~%%n,1!" neq "" (set/a "ls+=%%n"&set "_s=!_s:~%%n!")
      )
      for /L %%n in (1,1,!ls!) do for %%c in (" ", " ", "        ") do if "%%~c"=="!s:~,1!" (
         set "s=!s:~1!"&set/a "ls-=1")
      for /L %%n in (0,1,!ls!) do (
         set "c=!s:~%%n,1!" & if ^!c! == ^" (
            set/a "pm=0-!pm!" &if !pm! equ -1 (set "c=“") else (set "c=”")
         ) else if "!c!" == "'" (set/a "qm=0-!qm!" &if !qm! equ -1 (set "c=‘") else (set "c=’"))
         set "_line=!_line!!c!"
      )
      echo,!_line!&set "_line="&set "ls=0"
   ))>"%%~F%date%.txt"
del "%%~F"
)

endlocal&exit/b

求大师帮助。谢谢
发表于 2024-3-12 11:50:53 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-3-12 12:04 编辑

回复 1# dzwind

可在11-12行替换其他的中文双引号和中文单引号类型

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in ('dir/s/b/a-d *.txt') do (
  3.    set/a "pm=1,qm=1"
  4.    (for /f "usebackq delims=" %%a in ("%%~F") do (
  5.       set "s=%%a"&set "_s=%%a"
  6.       for %%p in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  7.          if "!_s:~%%p,1!" neq "" (set/a "ls+=%%p"&set "_s=!_s:~%%p!")
  8.       )
  9.       for /L %%n in (0,1,!ls!) do (
  10.          set "c=!s:~%%n,1!" & if ^!c! == ^" (
  11.             set/a "pm=0-!pm!" &if !pm! equ -1 (set "c=“") else (set "c=”")
  12.          ) else if "!c!" == "'" (set/a "qm=0-!qm!" &if !qm! equ -1 (set "c=‘") else (set "c=’"))
  13.          set "_line=!_line!!c!"
  14.       )
  15.       echo,!_line!&set "_line="&set "ls=0"
  16.    ))>"%%~F.new"
  17. )
  18. endlocal&exit/b
复制代码
 楼主| 发表于 2024-3-12 11:57:11 | 显示全部楼层
回复 2# aloha20200628


    跪谢,我给大哥磕一个!
 楼主| 发表于 2024-3-12 14:49:12 | 显示全部楼层
本帖最后由 dzwind 于 2024-3-12 15:45 编辑
回复  dzwind

可在11-12行替换其他的中文双引号和中文单引号类型
aloha20200628 发表于 2024-3-12 11:50



再求2个要求:1、将英文省略号改为中文省略号。2、删除每个txt文件的每段开始的段首空格。
谢谢!
发表于 2024-3-12 21:11:09 | 显示全部楼层
回复 4# dzwind

在强力脚本中是现成工具,回到批处理脚本中很可能要自力更生...玩弄古刀老枪也成了一套日常的脑力操
如下代码说明》
第5行设置的6点英文省略号,其类型可调整
第9行设置了3种空白字符:英文空格/中文空格/制表符,可随需删减

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in ('dir/s/b/a-d *.txt') do (
  3.    set/a "pm=1,qm=1"
  4.    (for /f "usebackq delims=" %%a in ("%%~F") do (
  5.       set "s=%%a"&set "s=!s:......=…!"&set "_s=!s!"
  6.       for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  7.          if "!_s:~%%n,1!" neq "" (set/a "ls+=%%n"&set "_s=!_s:~%%n!")
  8.       )
  9.       for /L %%n in (1,1,!ls!) do for %%c in (" ", "        ", " ") do if "%%~c"=="!s:~,1!" (
  10.          set "s=!s:~1!"&set/a "ls-=1")
  11.       for /L %%n in (0,1,!ls!) do (
  12.          set "c=!s:~%%n,1!" & if ^!c! == ^" (
  13.             set/a "pm=0-!pm!" &if !pm! equ -1 (set "c=“") else (set "c=”")
  14.          ) else if "!c!" == "'" (set/a "qm=0-!qm!" &if !qm! equ -1 (set "c=‘") else (set "c=’"))
  15.          set "_line=!_line!!c!"
  16.       )
  17.       echo,!_line!&set "_line="&set "ls=0"
  18.    ))>"%%~F.new"
  19. )
  20. endlocal&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

 楼主| 发表于 2024-3-12 21:17:05 | 显示全部楼层
本帖最后由 dzwind 于 2024-3-19 16:45 编辑

谢谢 aloha20200628 大师的帮助,此BAT已经帮助我解决了大部分的问题。
但也逐步发现一个问题,再求 aloha20200628 大师添加语句。
有的文章里英文引号很多,作者写错了引号,或者说引号少了反引号,这个现有的批处理无法根据词句的意思判断是否更改成正确方向的中文引号,所以能不能加上一个在英文变中文引号转化过程中,当遇到:时后面的英文引号更改为向右引的中文引号。
 楼主| 发表于 2024-3-19 16:46:43 | 显示全部楼层
回复  dzwind

在强力脚本中是现成工具,回到批处理脚本中很可能要自力更生...玩弄古刀老枪也成了一套日 ...
aloha20200628 发表于 2024-3-12 21:11



   
再求aloha20200628 大师的帮助,此BAT已经帮助我解决了大部分的问题。
但也逐步发现一个问题,再求 aloha20200628 大师添加语句。
有的文章里英文引号很多,有时作者写错了引号,有时句子中的少了反引号,这个现有的批处理无法根据词句的意思判断是否更改成正确方向的中文引号,
所以能不能加上一个在英文变中文引号转化过程中,当遇到:时后面的英文引号更改为向右引的中文引号。
发表于 2024-3-19 21:04:55 | 显示全部楼层
回复 7# dzwind

如很多低质小说网站经常出现这类恶心事,并非仅是引号左右错配,还加上左右引号根本不配对,整个弄得乱七八糟... 下载之后即使用专业编辑器也很难收拾利索。
以前提供的批处理脚本只能基于引号配对正确的前提,引号左右错配没问题,但不能配对错误,一个配对错误会导致其后全乱... 也许有人会拿此题叫ai试试...
 楼主| 发表于 2024-3-20 09:08:30 | 显示全部楼层
回复  dzwind

如很多低质小说网站经常出现这类恶心事,并非仅是引号左右错配,还加上左右引号根本不配对 ...
aloha20200628 发表于 2024-3-19 21:04



    明白了,我手动修改吧。谢谢
发表于 2024-3-28 16:51:30 | 显示全部楼层
回复 1# dzwind

可在5楼代码中将第5行改为如下代码行即可,楼主以后若要替换其他符号亦可按此方法自己操练...

  1. set "s=%%a"&set "s=!s:......=…!"&set "!s:--=——!"&set "_s=!s!"
复制代码
 楼主| 发表于 2024-3-28 17:13:09 | 显示全部楼层
谢谢大师的帮助!
 楼主| 发表于 2024-6-3 16:24:44 | 显示全部楼层
回复  dzwind

在强力脚本中是现成工具,回到批处理脚本中很可能要自力更生...玩弄古刀老枪也成了一套日 ...
aloha20200628 发表于 2024-3-12 21:11



    请问达人?第9行如何添加删除文档开头的"?"符号?
我自己手动添加了,不管用。
for /L %%n in (1,1,!ls!) do for %%c in (" ", "        ", "        ","?") do if "%%~c"=="!s:~,1!" (
         set "s=!s:~1!"&set/a "ls-=1")
发表于 2024-6-3 20:50:43 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-6-3 20:57 编辑

回复 12# dzwind

删除文本行头部英文?字符不能直接加入5楼代码第9行,因为 for %%a in (...) 表达式中的?和*会被cmd视为通配符处理,故须改用别法解决...
新代码如下》其中第11行代码排列了文本行头部可能要被删除的多种字符,如中英文空格和制表符以及英文?字符...

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in ('dir/s/b/a-d *.txt') do (
  3.    set/a "pm=1,qm=1"
  4.    (for /f "usebackq delims=" %%a in ("%%~F") do (
  5.       set "s=%%a"&set "s=!s:......=…!"&set "_s=!s!"
  6.       for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  7.          if "!_s:~%%n,1!" neq "" (set/a "ls+=%%n"&set "_s=!_s:~%%n!")
  8.       )
  9.       for /L %%n in (1,1,!ls!) do (
  10.                  set "c=!s:~,1!" &set "x=0"
  11.                  if "!c!" neq " " if "!c!" neq "        " if "!c!" neq " " if "!c!" neq "?" (set "x=1")
  12.                  if !x! equ 0 (set "s=!s:~1!"&set/a "ls-=1")
  13.           )
  14.       for /L %%n in (0,1,!ls!) do (
  15.          set "c=!s:~%%n,1!" & if ^!c! == ^" (
  16.             set/a "pm=0-!pm!" &if !pm! equ -1 (set "c=“") else (set "c=”")
  17.          ) else if "!c!" == "'" (set/a "qm=0-!qm!" &if !qm! equ -1 (set "c=‘") else (set "c=’"))
  18.          set "_line=!_line!!c!"
  19.       )
  20.       echo,!_line!&set "_line="&set "ls=0"
  21.    ))>"%%~F.new"
  22. )
  23. endlocal&exit/b
复制代码
 楼主| 发表于 2025-9-29 17:04:14 | 显示全部楼层
本帖最后由 dzwind 于 2025-9-29 18:33 编辑

回复 10# aloha20200628


    @echo off &setlocal enabledelayedexpansion
if "%~1"=="" exit/b
pushd "%~1"
for /r %%F in (*.txt) do (
   set/a "pm=1,qm=1"
   (for /f "usebackq delims=" %%a in ("%%~F") do (
      set "s=%%a"&set "s=!s:......=……!"&set "s=!s:--=——!"&set "_s=!s!"
      for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
         if "!_s:~%%n,1!" neq "" (set/a "ls+=%%n"&set "_s=!_s:~%%n!")
      )
      for /L %%n in (1,1,!ls!) do for %%c in (" ", "  ", "        ") do if "%%~c"=="!s:~,1!" (
         set "s=!s:~1!"&set/a "ls-=1")
      for /L %%n in (0,1,!ls!) do (
         set "c=!s:~%%n,1!" & if ^!c! == ^" (
            set/a "pm=0-!pm!" &if !pm! equ -1 (set "c=“") else (set "c=”")
         ) else if "!c!" == "'" (set/a "qm=0-!qm!" &if !qm! equ -1 (set "c=‘") else (set "c=’"))
         set "_line=!_line!!c!"
      )
      echo,!_line!&set "_line="&set "ls=0"
   ))>"%%~F%date%.txt"
del "%%~F"
)

endlocal
exit/b
时隔一年,再次求教aloha20200628:我用您提供的语句改成了以拖拽方式运行至某个文件夹下的所有的txt文本后,发现文本所有的英文的!感叹号被删除了,还将部分的文字内容删除了,请您帮我改改行不?保留英文感叹号,或者把英文感叹号成为中文感叹号
发表于 2025-9-29 20:15:04 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-30 10:06 编辑

回复 14# dzwind

因为需要全程开启变量延迟,所以文本行中包含的英文 ! 字符会被拦截,可用以下代码(修订13楼代码)解决这个问题,但运行效率会有折扣(尤其是处理成千上万行文本文件时),若楼主认可,也就算是一个比较完整的纯批解决方案了...

  1. @echo off &setlocal
  2. for /f "delims=" %%F in ('dir/s/b/a-d *.txt') do (
  3.    (for /f "usebackq delims=" %%a in ("%%F") do set "x=%%a" &call echo,%%x:!=╫%%)>"#.$"
  4.    setlocal enabledelayedexpansion &set/a "pm=1,qm=1"
  5.    (for /f "delims=" %%a in (#.$) do (
  6.       set "s=%%a" &set "s=!s:......=……!" &set "s=!s:--=——!" &set "_s=!s!"
  7.       for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  8.          if "!_s:~%%n,1!" neq "" (set/a "ls+=%%n" &set "_s=!_s:~%%n!") )
  9.       for /L %%n in (1,1,!ls!) do (
  10.           set "c=!s:~,1!" &set "x=0"
  11.           if "!c!" neq " " if "!c!" neq "        " if "!c!" neq " " if "!c!" neq "?" (set "x=1")
  12.           if !x! equ 0 (set "s=!s:~1!" &set/a "ls-=1") )
  13.       for /L %%n in (0,1,!ls!) do (
  14.          set "c=!s:~%%n,1!"
  15.          if ^!c! == ^" (
  16.              set/a "pm=0-!pm!"
  17.              if !pm! equ -1 (set "c=“") else (set "c=”")
  18.          ) else if "!c!" == "'" (
  19.              set/a "qm=0-!qm!"
  20.              if !qm! equ -1 (set "c=‘") else (set "c=’") )
  21.          set "_line=!_line!!c!" )
  22.       echo,!_line!&set "_line=" &set "ls=0" ) )>"$.#"
  23.    endlocal
  24.    (for /f "delims=" %%a in ($.#) do set "x=%%a" &call echo,%%x:╫=!%%)>"%%~F.new"
  25. )
  26. del /q #.$ $.# &pause&exit/b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:06 , Processed in 0.028986 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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