[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 【已解决】批处理提速:按行拆分文件,并以行首字符命名

本帖最后由 思想之翼 于 2023-9-16 03:57 编辑

【示例】
D:\DATA\data.txt记录格式如下:
029=书 生 气
123=书 生 气
按行分割文件,并以等号左侧字符为文件名,等号右侧字符转置成竖排。
结果为:
029.txt记录格式为:



123.txt记录格式为:




【解决方案】
  1. @echo off
  2. chcp 65001
  3. for /f "useback tokens=1* delims==" %%a in ("D:\DATA\data.txt") do (
  4.     (for %%c in (%%b) do (
  5.         echo %%c
  6.     ))>"D:\DATA\%%a.txt"
  7. )
  8. pause
复制代码
【问题】
上述纯批速度太慢,能用第三方工具提速吗?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

powershell  勿套娃
  1. [regex]::Replace((gc 'D:\DATA\data.txt' -raw),'(?s)[^=\n]+=[^\r\n$]+',{$p=$args.value.Split('=',2);sc ".\$($p[0]).txt" -Value [regex]::Replace($p[1],'(.)',"`$1`r`n");})
复制代码
1

评分人数

QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

多少行,用了多少秒觉得慢。
想搞到大概多少秒。

TOP

不知行否,会在当前目录下创建结果文件
不知道会不会快点
  1. @echo off
  2. set "filepath=D:\DATA\data.txt"
  3. if not exist "%filepath%" echo file not found&pause&exit/b
  4. set "filepath=%filepath:\=\\%"
  5. gawk "BEGIN{i=0;while(getline <\"%filepath%\"){i=index($0,\"=\");if(i){o=substr($0,0,i-1);s=substr($0,i+1);gsub(/ /,\"\r\n\",s);print s >o\".txt\"}}}"
  6. echo done&pause
复制代码
1

评分人数

TOP

回复 4# Five66
感谢!经测试,结果为:






字符间多出若干空行。

TOP

回复 2# xczxczxcz

感谢!经测试,没有输出结果。

TOP

本帖最后由 Five66 于 2023-9-16 00:14 编辑

回复 5# 思想之翼


将第7行的print s换成 printf(s)

之前那\r\n换成\n
1

评分人数

TOP

回复 4# Five66
感谢!结果正确。欲在D:\NEWDATA\下创建结果文件,如何修改?

TOP

回复 8# 思想之翼


第7行的
>o\".txt\"
改成
>\"D:\\NEWDATA\\\\\"o\".txt\"

还有之前结果多出空行那时,如果改成了printf(s),s中有%号之类的字符会出错,得换成printf(\"%%s\",s)这完整式
1

评分人数

TOP

本帖最后由 xczxczxcz 于 2023-9-16 01:58 编辑

回复 6# 思想之翼
加一组括号即可
  1. [regex]::Replace((gc 'D:\DATA\data.txt' -raw),'(?s)[^=\n]+=[^\r\n$]+',{$p=$args.value.Split('=',2);sc ".\$($p[0]).txt" -Value ([regex]::Replace($p[1],'(.)',"`$1`r`n"));})
复制代码
1

评分人数

QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

  1. @echo off
  2. chcp 65001 >nul
  3. rem 假设总行数不超过 2000000
  4. %1 (for /l %%l in (0,50000,2000000) do (start /min "" "%~f0" rem %%l))&exit
  5. if %~2 equ 0 (
  6. set str=
  7. ) else (
  8. set str=skip=%~2
  9. )
  10. for /f "%str% useback tokens=1* delims==" %%a in ("D:\DATA\data.txt") do (
  11. if exist "D:\DATA\%%a.txt" (
  12. exit
  13. )
  14. (for %%c in (%%b) do (
  15. echo %%c
  16. ))>"D:\DATA\%%a.txt"
  17. )
  18. exit
复制代码

5万行打开一个窗口,并行处理
1

评分人数

bat小白,请多指教!谢谢!

TOP

返回列表