[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理怎样合并文本的三行到一行?

本帖最后由 LTSC1809 于 2024-5-10 20:44 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set js=1
  4. for /f "delims=" %%i in (a.txt) do (
  5.     set a[!js!]=%%i
  6.     set a[!js!]=%a[!js!]:----=-%
  7.     echo %a[!js!]%
  8.     set /a js+=1
  9. )
  10. cls
  11. set jslast=js
  12. set js=1
  13. set jst=0
  14. :loop
  15. set /a jst+=3
  16. set /a o=jst-1
  17. set /a t=jst-2
  18. echo %a!t!% %a!o!% %a!jst!%>>b.txt
  19. echo %a!t!% %a!o!% %a!jst!%
  20. set /a js+=1
  21. if %js% leq %jslast% goto loop
复制代码
我的需求是将一个每行格式为xxxx----xxxx,有很多行的文本文件处理为把所有的----换成一个- 然后要把原来的三行弄到一行去。但是这个我尝试了一下,最开始第一个for读取文件的循环中第四行echo %a[!js!]%显示的是ECHO 处于关闭状态,也就是%a[!js!]%这个变量未定义 这是怎么回事
一个六年级小学生,请多指教

回复 1# LTSC1809
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set js=1
  4. for /f "delims=" %%i in (a.txt) do (
  5.     set a[!js!]=%%i
  6.     call set a[!js!]=%%a[!js!]:----=-%%
  7.     call echo %%a[!js!]%%
  8.     set /a js+=1
  9. )
  10. cls
  11. set jslast=%js%
  12. set js=1
  13. set jst=0
  14. :loop
  15. set /a jst+=3
  16. set /a o=jst-1
  17. set /a t=jst-2
  18. call echo %%a[!t!]%% %%a[!o!]%% %%a[!jst!]%%>>b.txt
  19. call echo %%a[!t!]%% %%a[!o!]%% %%a[!jst!]%%
  20. echo %jst% %jslast%
  21. if %jst% LEQ %jslast% goto loop
复制代码
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $txt=gc .\a.txt|%{$_.replace("----","-")}
  7. 0..(($txt.Length-$txt.Length%3)/3)|%{$txt[3*$_]+" "+$txt[3*$_+1]+" "+$txt[3*$_+2]>>b.txt}
复制代码
1

评分人数

TOP

回复 1# LTSC1809
  1. @echo off
  2. (for /f "tokens=1,2 delims=-" %%a in ('type "1.txt"') do (
  3.     set /a n+=1
  4.     set /a m=n%%3
  5.     set /p=%%a-%%b <nul
  6.     set /a test=1/m 2>nul || echo,
  7. ))>"2.txt"
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 aloha20200628 于 2024-5-10 15:41 编辑

回复 1# LTSC1809

假设楼主的源文件中不包含!^等特殊字符,批处理代码如下...
  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (1.txt) do (
  3. set "_s=%%a"&set "s=!s!!_s:----=-!"&set/a "n+=1"
  4. if !n! equ 3 (echo,!s!&set "n=0"&set "s=")
  5. ))>2.txt
  6. pause&exit/b
复制代码
若源文件中包含!^等特殊字符,批处理代码如下(有幸set/a变量能在循环体内自由出入变量延迟期 )...
  1. @echo off &setlocal
  2. (for /f "delims=" %%a in (1.txt) do (
  3. set "_s=%%a"&set/a "n+=1"
  4. setlocal enabledelayedexpansion
  5. set/p="!_s:----=-!"<nul
  6. if !n! equ 3 (echo,&set/a "n=0")
  7. endlocal
  8. ))>2.txt
  9. exit/b
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-5-10 19:03 编辑

回复 1# LTSC1809

如果批处理代码中采用 set/p... 输出字符串,要求不能在头部包含空格和=等字符,否则空格会被删除,=会导致报错退出。因此为避免入坑则要改用如下代码...
call可用于set和echo但不能用于if语块,故还须有劳‘延迟变量!n!和!s!’来串场解围
  1. @echo off &setlocal
  2. (for /f "delims=" %%a in (1.txt) do (
  3. set "_s=%%a"&set/a "n+=1"
  4. call set "s=%%s%%%%_s:----=-%%"
  5. setlocal enabledelayedexpansion
  6. if !n! equ 3 (
  7. echo,!s!
  8. endlocal
  9. set/a "n=0"&set "s="
  10. ) else endlocal
  11. ))>2.txt
  12. pause&exit/b
复制代码
1

评分人数

TOP

返回列表