如何优化Batch脚本提取大文件中关键词间内容
优化大文件下的Batch关键词内容提取脚本
原Batch脚本处理10万行以内的JSON格式文本文件时效率尚可,但处理566857行的大文件时速度极慢,需要优化以高效提取"name"与"caow"之间的内容,且必须保持Batch环境。
原脚本代码:
@ECHO OFF SETLOCAL SET "sourcedir=%~dp0New folder 1" SET "destdir=%~dp0New folder 2" for /f "tokens=1 delims=[]" %%a in ('find /n "name"^<"%sourcedir%\nsb.txt" ') do set /a start=%%a for /f "tokens=1 delims=[]" %%a in ('find /n "caow"^<"%sourcedir%\nsb.txt" ') do set /a end=%%a ( for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%sourcedir%\nsb.txt" ') do ( IF %%a geq %start% IF %%a leq %end% ECHO(%%b ) )>"%destdir%\(1).txt" GOTO :EOF
优化后的脚本
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET "sourcedir=%~dp0New folder 1" SET "destdir=%~dp0New folder 2" SET "inFile=%sourcedir%\nsb.txt" SET "outFile=%destdir%\(1).txt" SET "outputFlag=0" ( FOR /F "usebackq delims=" %%L IN ("%inFile%") DO ( REM 检测到"name"行,开启输出开关并输出该行 IF "%%L"==" \"name\": 6," ( SET "outputFlag=1" ECHO(%%L GOTO :nextLine ) REM 检测到"caow"行,输出该行后关闭开关并终止循环 IF "%%L"==" \"caow\": [" ( ECHO(%%L SET "outputFlag=0" GOTO :exitLoop ) REM 输出开关开启时,输出当前行 IF !outputFlag! EQU 1 ( ECHO(%%L ) :nextLine ) :exitLoop ) > "%outFile%" ENDLOCAL GOTO :EOF
优化说明
- 减少文件遍历次数:原脚本需要三次读取整个大文件(两次查询行号、一次提取内容),优化后仅遍历一次,大幅降低IO开销。
- 启用延迟扩展:通过
ENABLEDELAYEDEXPANSION实现循环内变量的实时更新,精准控制输出开关的状态。 - 精准匹配目标行:直接匹配
"name"和"caow"所在的完整行(需根据实际文件格式调整匹配字符串),省去行号计算的额外消耗。 - 提前终止循环:找到
"caow"行后立即退出循环,无需处理后续无关内容,节省大量处理时间。
注意事项
如果目标文件中"name"或"caow"的行格式与示例片段不完全一致,需修改脚本中对应的匹配字符串,确保能准确触发输出开关的状态变化。
内容的提问来源于stack exchange,提问作者JR Santos
相关产品推荐
相关产品推荐

