找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20785|回复: 10

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

[复制链接]
发表于 2023-9-15 18:26:56 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 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
复制代码
【问题】
上述纯批速度太慢,能用第三方工具提速吗?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-9-15 20:04:13 | 显示全部楼层
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技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

发表于 2023-9-15 21:45:18 | 显示全部楼层
多少行,用了多少秒觉得慢。
想搞到大概多少秒。
发表于 2023-9-15 21:59:51 | 显示全部楼层
不知行否,会在当前目录下创建结果文件
不知道会不会快点

  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技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

 楼主| 发表于 2023-9-15 23:21:49 | 显示全部楼层
回复 4# Five66
感谢!经测试,结果为:






字符间多出若干空行。
 楼主| 发表于 2023-9-15 23:22:55 | 显示全部楼层
回复 2# xczxczxcz

感谢!经测试,没有输出结果。
发表于 2023-9-16 00:06:10 | 显示全部楼层
本帖最后由 Five66 于 2023-9-16 00:14 编辑

回复 5# 思想之翼


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

之前那\r\n换成\n

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-9-16 00:48:10 | 显示全部楼层
回复 4# Five66
感谢!结果正确。欲在D:\NEWDATA\下创建结果文件,如何修改?
发表于 2023-9-16 01:51:32 | 显示全部楼层
回复 8# 思想之翼


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

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

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-9-16 01:56:47 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-9-16 11:24:13 | 显示全部楼层
  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技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 14:18 , Processed in 0.021550 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表