Board logo

标题: [文本处理] 【已解决】批处理按各文本的总行数,在每行行首添加递增序号(位数对齐) [打印本页]

作者: 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

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (*.txt) do (
  4.     set "filename=%%i"
  5.     set /a totalLines=0
  6.    
  7.     for /f "delims=" %%j in ('type "!filename!" ^| find /c /v ""') do (
  8.         set /a totalLines=%%j
  9.     )
  10.    
  11.     if !totalLines! gtr 999 (
  12.         echo 文件 "!filename!" 超出999行,无法处理。
  13.     ) else (
  14.         set /a lineNo=1
  15.         for /f "usebackq delims=" %%k in ("!filename!") do (
  16.             set /a paddedLineNo=1000000 + !lineNo!
  17.             set "formattedLine=!paddedLineNo:~-3! %%k"
  18.             set /p "=!formattedLine!" < NUL
  19.             echo(
  20.             set /a lineNo+=1
  21.         )
  22.         
  23.         >> "!filename!" (
  24.             for /l %%l in (1,1,!totalLines!) do (
  25.                 set /a paddedLineNo=1000000 + %%l
  26.                 set "formattedLine=!paddedLineNo:~-3! "
  27.                 echo !formattedLine!
  28.             )
  29.         )
  30.     )
  31. )
  32. echo 批量处理完成。
  33. 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

  1. @echo off
  2. cd /d "%~dp0"
  3. set n=0
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5. setlocal
  6. call :1 "%%i"
  7. endlocal
  8. )
  9. pause & exit
  10. :1
  11. for /f "useback delims=" %%a in ("%~1") do (
  12. set /a n+=1
  13. )
  14. if %n% gtr 999 (
  15. echo [%~1]超出999行,无法处理
  16. exit /b
  17. ) else if %n% gtr 99 (
  18. set m=10000
  19. ) else if %n% gtr 9 (
  20. set m=1000
  21. ) else (
  22. set m=100
  23. )
  24. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%~1"') do (
  25. if "%%b" neq "" (
  26. set str=%%b
  27. set /a m+=1
  28. setlocal enabledelayedexpansion
  29. echo !m:~2! !str!
  30. endlocal
  31. ) else (
  32. echo=
  33. )
  34. ))>$
  35. move $ "%~1"
  36. exit /b
复制代码

使用前先备份
作者: annwayili    时间: 2024-3-12 18:46

回复 4# 77七

非常感谢!

经测试,完美达到要求!连空行也能跳过去了









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