|
|
楼主 |
发表于 2025-6-22 17:22:51
|
显示全部楼层
本帖最后由 rdingding1 于 2025-6-22 17:24 编辑
目前待改进的点:
1)findstr无法彻底筛查
更改思路,不使用findstr,该条实现的目的是“两个文本集求差集”
目前可以用grep或awk(本站第三方工具下载中的最新64位版本,和脚本放置到一起)替换原方法二的第23行或方法三的第27行
grep方案:不会出现筛查重复,文件多时效率比findstr略低- dir /b /s /a-d "%input_dir%\*.txt" | grep64 -F -v -f "%processed_list%">$.#
复制代码 awk方案:不会出现筛查重复,文件多时效率极高(awk的数组类似内存hash对应,18K个文件,记录文件空/满/一半时间分别为26s/1s/12s)- dir /b /s /a-d "%input_dir%\*.txt">@.@
- gawk64 "NR==FNR{ a[$0]=$0 } NR>FNR{ if(a[$0] == """"""){ print $0}}" "%processed_list%" @.@>$.#
复制代码 2)使用 延迟变量 导致的特殊字符! 丢失
在用18K个样品文件测试时发现有10个文件名的 ! 丢失了,查询发现使用延迟变量造成,目前的解决方案是采用临时文件做替换中转,这样又会造成IO读写增加,所以去除变量追加,缩小延迟变量范围,改回单次直接>> 日志文件和记录文件
3)关于“在主循环内反复追写 >> 日志文件和记录文件,此条效率及IO读写问题”,原采用变量缓存一段再批量写入方式,因为批处理变量小于8190 以及 延迟变量 导致的特殊字符!引发的问题,暂时不优化。
实际18K个文件路径的文本也不大,后面用python重写时,可以1K或0.5K个文件记录一次。
最后,目前的脚本(方法四,采用awk)如下- @echo off
- rem 使用说明:断点续处理.cmd 待处理路径
- rem 使用说明:处理txt文档
- rem ========== 配置区域 ==========
- set "input_dir=%~1"
- set "log_file=operation.log"
- set "processed_list=processed_files.txt"
- rem ========== 初始化 ==========
- if not exist "%input_dir%" (
- echo 错误:目录不存在
- echo 错误:目录不存在 >> "%log_file%"
- exit /b 1
- )
- echo 开始处理: %date% %time%
- echo 开始处理: %date% %time% > "%log_file%"
- if not exist "%processed_list%" (
- echo 记录开始 > "%processed_list%"
- )
- set t=%time%
- rem ========== 主循环 ==========
- set /a count = 1
- dir /b /s /a-d "%input_dir%\*.txt">@.@
- gawk64 "NR==FNR{ a[$0]=$0 } NR>FNR{ if(a[$0] == """"""){ print $0}}" "%processed_list%" @.@>$.#
- for /f "delims=" %%i in ('find /v /c "" $.#') do set totalcount=%%i
- set totalcount=%totalcount:*:=%
- for /f "delims=" %%a in ($.#) do (
- setlocal enabledelayedexpansion
- set /p =!count! / %totalcount% <nul
- set /p =<nul
- endlocal
- rem 要处理的语句
- echo %%a 已处理 >> "%log_file%"
- echo %%a>>"%processed_list%"
- set /a count += 1
- )
- del /q $.#
- del /q @.@
- :: ========== 收尾 ==========
- set t1=%time%
- if "%t1:~,2%" lss "%t:~,2%" set "add=+24"
- set /a "times=(%t1:~,2%-%t:~,2%%add%)*360000+(1%t1:~3,2%%%100-1%t:~3,2%%%100)*6000+(1%t1:~6,2%%%100-1%t:~6,2%%%100)*100+(1%t1:~-2%%%100-1%t:~-2%%%100)" ,"ss=(times/100)%%60","mm=(times/6000)%%60","hh=times/360000","ms=times%%100"
- echo 处理完成: %date% %time%
- echo 处理完成: %date% %time% >> "%log_file%"
- echo 共处理 %totalcount% 个文件,耗时 %hh%:%mm%:%ss%.%ms% 秒
- echo 操作日志已保存到: %log_file%
- pause
复制代码 |
|