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

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

[复制链接]
发表于 2024-3-12 17:00:12 | 显示全部楼层 |阅读模式
基本情况:
文件夹内有多个文本,每个文本有不等的行数。

具体要求:
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行,无法处理”。

请高手帮忙一个!
谢谢!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-3-12 17:13:17 | 显示全部楼层
  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位)。
将带有前缀序号的新行内容追加回原文件。
注意:此脚本会直接修改原始文本文件,请在运行前做好备份工作。

评分

参与人数 1技术 +1 收起 理由
annwayili + 1 感谢!

查看全部评分

 楼主| 发表于 2024-3-12 18:26:17 | 显示全部楼层
本帖最后由 annwayili 于 2024-3-12 18:29 编辑

回复 2# hhak003

感谢!

我试了,这个BAT不能达到要求:
1、我不是固定三位的递增序号。我是希望是与总行数位数一致的递增序号位数。
2、得到的文本文件,递增序号不是在行首。

测试情况见下图


发表于 2024-3-12 18:28:44 | 显示全部楼层
  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
复制代码

使用前先备份

评分

参与人数 2技术 +2 收起 理由
annwayili + 1 感谢!
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2024-3-12 18:46:32 | 显示全部楼层
回复 4# 77七

非常感谢!

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




您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 06:03 , Processed in 0.018246 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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