Board logo

标题: [文本处理] 批处理怎样把txt合并后,行号重新排序? [打印本页]

作者: karmane    时间: 2022-3-21 22:57     标题: 批处理怎样把txt合并后,行号重新排序?

现在通过copy命令实现了txt文件的合并,但是行号怎么实现从1开始的顺序排序呢???
作者: Batcher    时间: 2022-3-22 11:55

回复 1# karmane


请举例说明一下你的需求,比如合并之前什么样,合并之后又是什么样?

如需上传截图,请用图床:
http://bbs.bathome.net/thread-60985-1-1.html

如需上传附件,请用阿里云盘或百度网盘。
作者: karmane    时间: 2022-3-24 23:31

回复 2# Batcher
文本的格式是一样的(逗号分割文件),有时候需要把多个文件合并成一个,但是序号要从1开始的顺序递增。
如下图:

作者: karmane    时间: 2022-3-24 23:32


作者: karmane    时间: 2022-3-24 23:36

奇怪了,怎么看不到截图呢?

作者: Batcher    时间: 2022-3-25 08:42

回复 3# karmane


请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. set "n=0"
  5. (for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
  6.     for /f "tokens=1* delims=," %%b in ('type "%%a"') do (
  7.         set /a n+=1
  8.         echo !n!,%%c
  9.     )
  10. ))>"合并.tmp"
  11. ren "合并.tmp" "合并.txt"
复制代码

作者: qinxg    时间: 2022-3-25 08:42

合并后
sort 合并.txt >1.txt
作者: qixiaobin0715    时间: 2022-3-25 08:56

  1. @echo off
  2. (for /f "tokens=1,2* delims=,:" %%i in ('findstr /n .* 合并后的文本.txt') do echo,%%i,%%k)>行号重排.txt
  3. del 合并后的文本.txt
复制代码

作者: Batcher    时间: 2022-3-25 09:00

回复 7# qinxg


    你可能没有看清楚需求吧,他那些第一列的数字是文本的一部分,所以是需要修改的
作者: karmane    时间: 2022-3-25 22:18

回复 6# Batcher
亲测可以,谢谢!如果早知道有这个论坛,那该多好啊。。。
作者: karmane    时间: 2022-3-25 22:23

回复 7# qinxg
虽然没有实现排序的需求,但也让我学习了“sort”命令,感谢!
作者: karmane    时间: 2022-3-25 22:26

回复 8# qixiaobin0715
简单的一行命令就能实现,牛,我还得好好消化一下呢,,感谢!
作者: qixiaobin0715    时间: 2022-3-26 08:34

实际上标准姿势或者规范写法应当是:
  1. @echo off
  2. (
  3.     for /f "tokens=1,2* delims=,:" %%i in ('findstr /n .* 合并后的文本.txt') do (
  4.         echo,%%i,%%k
  5.     )
  6. )>行号重排.txt
  7. del 合并后的文本.txt
复制代码
这样好理解一些。
作者: karmane    时间: 2022-3-26 22:18

回复 13# qixiaobin0715
学习学习
作者: karmane    时间: 2022-4-19 22:33

回复 8# qixiaobin0715

再请教一下
定义了一个路径的变量,想实现输出路径的灵活配置,结果报错了,求解。。。
@echo off
set Path="D:\合并\输出"
(for /f "tokens=1,2* delims=,:" %%i in ('findstr /n .* %Path%\合并后的文本.txt') do echo,%%i,%%k)>%Path%\行号重排.txt
del %Path%\合并后的文本.txt
作者: Batcher    时间: 2022-4-20 09:05

回复 15# karmane


    把所有的Path替换成myPath
作者: qixiaobin0715    时间: 2022-4-20 09:10

回复 15# karmane
%path%属于系统变量,尽量不要用系统变量名设置自定义变量。
你可以运行echo,%path%试试即知。
你这种情况用cd跳转到要处理的目录即可:
  1. cd /d "D:\合并\输出"
  2. (for /f "tokens=1,2* delims=,:" %%i in ('findstr /n .* 合并后的文本.txt') do echo,%%i,%%k)>行号重排.txt
  3. del 合并后的文本.txt
复制代码

作者: qixiaobin0715    时间: 2022-4-20 10:41

本帖最后由 qixiaobin0715 于 2022-4-20 13:06 编辑

也可以像在顶楼所说,不用先合并后处理合并后的文本,而是直接合并:
  1. @echo off
  2. cd /d "D:\合并\输出"
  3. (for /f "tokens=1,2* delims=:," %%a in ('find /v "" *.txt^|findstr /vr "\.TXT$ ^$"^|findstr /n .*') do echo,%%a,%%c)>合并.txt
  4. pause
复制代码

作者: karmane    时间: 2022-4-20 22:08

回复 16# Batcher
原来是变量名和关键字冲突了,搞半天,感谢,感谢
作者: karmane    时间: 2022-4-20 22:10

回复 17# qixiaobin0715
谢谢!又学到东西了。




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