标题: [文本处理] 【已解决】批处理按各文本的总行数,在每行行首添加递增序号(位数对齐) [打印本页]
作者: annwayili 时间: 2024-3-12 17:00 标题: 【已解决】批处理按各文本的总行数,在每行行首添加递增序号(位数对齐)
基本情况:
文件夹内有多个文本,每个文本有不等的行数。
具体要求:
1、在该文本的每行行首,从1开始,在第一行及之后依次添加“递增序号”+“一个空格”。
2、超过10行,就按总行数的位数,在不足位数的递增序号前面加0来补齐位数。
如果某某文本总行数超过999,则屏幕提示某某文本文件超出999行,无法处理。
3、不要生成新文件,覆盖原文件即可。
比如本级目录下有4个文本文件“A、B、C及D”。A共有8行,B共有56行,C共有128行,D共有1021行。
则:A的第1行行首添加“1 ”,第2行行首添加“2 ”.......最末行行首添加“8 ”。
B的第1行行首添加“01 ”,第2行行首添加“02 ”.......第10行行首添加“10 ”,第11行添加“11 ”.......最末行行首添加“56 ”。
C的第1行行首添加“001 ”,第2行行首添加“002 ”.......第10行行首添加“010 ”,第11行添加“011 ”.......第100行行首添加“100 ”,第101行添加“101 ”......最末行行首添加“128 ”。
D文本不添加,提示“D超出999行,无法处理”。
请高手帮忙一个!
谢谢!
作者: hhak003 时间: 2024-3-12 17:13
- @echo off
- setlocal enabledelayedexpansion
-
- for %%i in (*.txt) do (
- set "filename=%%i"
- set /a totalLines=0
-
- for /f "delims=" %%j in ('type "!filename!" ^| find /c /v ""') do (
- set /a totalLines=%%j
- )
-
- if !totalLines! gtr 999 (
- echo 文件 "!filename!" 超出999行,无法处理。
- ) else (
- set /a lineNo=1
- for /f "usebackq delims=" %%k in ("!filename!") do (
- set /a paddedLineNo=1000000 + !lineNo!
- set "formattedLine=!paddedLineNo:~-3! %%k"
- set /p "=!formattedLine!" < NUL
- echo(
- set /a lineNo+=1
- )
-
- >> "!filename!" (
- for /l %%l in (1,1,!totalLines!) do (
- set /a paddedLineNo=1000000 + %%l
- set "formattedLine=!paddedLineNo:~-3! "
- echo !formattedLine!
- )
- )
- )
- )
-
- echo 批量处理完成。
- pause
复制代码
----------------------------------------------------------
该脚本首先遍历当前目录下所有的 .txt 文本文件,对每个文件执行以下操作:
计算文件总行数,并检查是否超过999行。
如果不超过999行,则逐行读取并添加前缀序号(前面补零至3位)。
将带有前缀序号的新行内容追加回原文件。
注意:此脚本会直接修改原始文本文件,请在运行前做好备份工作。
作者: annwayili 时间: 2024-3-12 18:26
本帖最后由 annwayili 于 2024-3-12 18:29 编辑
回复 2# hhak003
感谢!
我试了,这个BAT不能达到要求:
1、我不是固定三位的递增序号。我是希望是与总行数位数一致的递增序号位数。
2、得到的文本文件,递增序号不是在行首。
测试情况见下图
作者: 77七 时间: 2024-3-12 18:28
- @echo off
- cd /d "%~dp0"
- set n=0
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- setlocal
- call :1 "%%i"
- endlocal
- )
- pause & exit
-
- :1
- for /f "useback delims=" %%a in ("%~1") do (
- set /a n+=1
- )
- if %n% gtr 999 (
- echo [%~1]超出999行,无法处理
- exit /b
- ) else if %n% gtr 99 (
- set m=10000
- ) else if %n% gtr 9 (
- set m=1000
- ) else (
- set m=100
- )
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%~1"') do (
- if "%%b" neq "" (
- set str=%%b
- set /a m+=1
- setlocal enabledelayedexpansion
- echo !m:~2! !str!
- endlocal
- ) else (
- echo=
- )
- ))>$
- move $ "%~1"
- exit /b
复制代码
使用前先备份
作者: annwayili 时间: 2024-3-12 18:46
回复 4# 77七
非常感谢!
经测试,完美达到要求!连空行也能跳过去了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |