求助:批量合并TXT文件时跳过每个文件的首尾行
解决方案:批量合并TXT文件并跳过首尾行
我明白你的需求:要把上百个结构相似的TXT文件合并到output.txt,但每个文件都要跳过开头的Class Category_xxx {和结尾的};,只保留中间内容。原来的copy命令没法处理行过滤,咱们换个思路来实现。
方法一:纯批处理方案(兼容旧版Windows)
这个方案用原生CMD命令实现,不需要额外工具:
@echo off setlocal enabledelayedexpansion :: 先删除旧的output.txt(如果存在) del output.txt 2>nul :: 遍历所有TXT文件,跳过output.txt本身 for /r %%i in (*.txt) do ( if not "%%~nxi"=="output.txt" ( set "skip_first_line=1" set "previous_line=" :: 逐行读取当前文件 for /f "usebackq delims=" %%a in ("%%i") do ( if !skip_first_line! equ 1 ( :: 跳过第一行 set "skip_first_line=0" ) else ( :: 先输出上一行,最后一行会被留在previous_line里不输出 if defined previous_line ( echo !previous_line!>>output.txt ) set "previous_line=%%a" ) ) ) ) echo 合并完成! pause
代码逻辑说明:
- 延迟扩展:启用
enabledelayedexpansion是为了在循环里实时更新变量值。 - 跳过第一行:用
skip_first_line标记,读到第一行时直接跳过,之后关闭标记。 - 跳过最后一行:通过缓存上一行的方式,每次输出的是前一行内容,当循环结束时,最后一行会留在
previous_line中,不会被写入文件。
方法二:PowerShell方案(更简洁高效)
如果你的系统是Win7及以上,PowerShell会是更简洁的选择,处理特殊字符也更稳定:
# 递归查找所有TXT文件,排除output.txt Get-ChildItem -Recurse -Filter *.txt | Where-Object { $_.Name -ne "output.txt" } | ForEach-Object { # 读取文件内容,取第二行到倒数第二行(数组索引从0开始) $content = Get-Content $_.FullName $content[1..($content.Count - 2)] | Add-Content output.txt }
代码逻辑说明:
Get-ChildItem递归获取所有TXT文件,Where-Object排除目标文件output.txt。Get-Content读取文件内容为数组,通过索引1..($content.Count-2)直接截取需要的行(跳过第0行即第一行,跳过最后一行即索引$content.Count-1)。Add-Content将截取的内容追加到output.txt。
注意事项
- 如果你的TXT文件包含特殊字符(比如
!),批处理方案可能会出现内容丢失,这时候优先选择PowerShell方案。 - 运行批处理时,建议在目标文件夹的空白处按住Shift右键,选择“在此处打开命令窗口/Windows终端”,再执行脚本。
内容的提问来源于stack exchange,提问作者Kiddo
相关产品推荐
相关产品推荐

