标题: [文本处理] [已解决]批处理怎样合并文本的三行到一行? [打印本页]
作者: LTSC1809 时间: 2024-5-10 12:42 标题: [已解决]批处理怎样合并文本的三行到一行?
本帖最后由 LTSC1809 于 2024-5-10 20:44 编辑
- @echo off
- setlocal enabledelayedexpansion
- set js=1
- for /f "delims=" %%i in (a.txt) do (
- set a[!js!]=%%i
- set a[!js!]=%a[!js!]:----=-%
- echo %a[!js!]%
- set /a js+=1
- )
- cls
- set jslast=js
- set js=1
- set jst=0
- :loop
- set /a jst+=3
- set /a o=jst-1
- set /a t=jst-2
- echo %a!t!% %a!o!% %a!jst!%>>b.txt
- echo %a!t!% %a!o!% %a!jst!%
- set /a js+=1
- if %js% leq %jslast% goto loop
复制代码
我的需求是将一个每行格式为xxxx----xxxx,有很多行的文本文件处理为把所有的----换成一个- 然后要把原来的三行弄到一行去。但是这个我尝试了一下,最开始第一个for读取文件的循环中第四行echo %a[!js!]%显示的是ECHO 处于关闭状态,也就是%a[!js!]%这个变量未定义 这是怎么回事
作者: pd1 时间: 2024-5-10 13:27
回复 1# LTSC1809 - @echo off
- setlocal enabledelayedexpansion
- set js=1
- for /f "delims=" %%i in (a.txt) do (
- set a[!js!]=%%i
- call set a[!js!]=%%a[!js!]:----=-%%
- call echo %%a[!js!]%%
- set /a js+=1
- )
-
-
- cls
- set jslast=%js%
- set js=1
- set jst=0
- :loop
-
- set /a jst+=3
- set /a o=jst-1
- set /a t=jst-2
- call echo %%a[!t!]%% %%a[!o!]%% %%a[!jst!]%%>>b.txt
-
- call echo %%a[!t!]%% %%a[!o!]%% %%a[!jst!]%%
-
- echo %jst% %jslast%
- if %jst% LEQ %jslast% goto loop
复制代码
- <# :
- @echo off
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
- pause
- #>
- $txt=gc .\a.txt|%{$_.replace("----","-")}
- 0..(($txt.Length-$txt.Length%3)/3)|%{$txt[3*$_]+" "+$txt[3*$_+1]+" "+$txt[3*$_+2]>>b.txt}
复制代码
作者: Batcher 时间: 2024-5-10 13:47
回复 1# LTSC1809 - @echo off
- (for /f "tokens=1,2 delims=-" %%a in ('type "1.txt"') do (
- set /a n+=1
- set /a m=n%%3
- set /p=%%a-%%b <nul
- set /a test=1/m 2>nul || echo,
- ))>"2.txt"
复制代码
作者: aloha20200628 时间: 2024-5-10 14:54
本帖最后由 aloha20200628 于 2024-5-10 15:41 编辑
回复 1# LTSC1809
假设楼主的源文件中不包含!^等特殊字符,批处理代码如下...- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (1.txt) do (
- set "_s=%%a"&set "s=!s!!_s:----=-!"&set/a "n+=1"
- if !n! equ 3 (echo,!s!&set "n=0"&set "s=")
- ))>2.txt
- pause&exit/b
复制代码
若源文件中包含!^等特殊字符,批处理代码如下(有幸set/a变量能在循环体内自由出入变量延迟期 )...- @echo off &setlocal
- (for /f "delims=" %%a in (1.txt) do (
- set "_s=%%a"&set/a "n+=1"
- setlocal enabledelayedexpansion
- set/p="!_s:----=-!"<nul
- if !n! equ 3 (echo,&set/a "n=0")
- endlocal
- ))>2.txt
- exit/b
复制代码
作者: aloha20200628 时间: 2024-5-10 16:14
本帖最后由 aloha20200628 于 2024-5-10 19:03 编辑
回复 1# LTSC1809
如果批处理代码中采用 set/p... 输出字符串,要求不能在头部包含空格和=等字符,否则空格会被删除,=会导致报错退出。因此为避免入坑则要改用如下代码...
call可用于set和echo但不能用于if语块,故还须有劳‘延迟变量!n!和!s!’来串场解围- @echo off &setlocal
- (for /f "delims=" %%a in (1.txt) do (
- set "_s=%%a"&set/a "n+=1"
- call set "s=%%s%%%%_s:----=-%%"
- setlocal enabledelayedexpansion
- if !n! equ 3 (
- echo,!s!
- endlocal
- set/a "n=0"&set "s="
- ) else endlocal
- ))>2.txt
- pause&exit/b
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |