Board logo

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

作者: 思想之翼    时间: 2023-9-15 18:26     标题: 【已解决】批处理提速:按行拆分文件,并以行首字符命名

本帖最后由 思想之翼 于 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
复制代码
【问题】
上述纯批速度太慢,能用第三方工具提速吗?
作者: xczxczxcz    时间: 2023-9-15 20:04

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");})
复制代码

作者: pd1    时间: 2023-9-15 21:45

多少行,用了多少秒觉得慢。
想搞到大概多少秒。
作者: Five66    时间: 2023-9-15 21:59

不知行否,会在当前目录下创建结果文件
不知道会不会快点
  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
复制代码

作者: 思想之翼    时间: 2023-9-15 23:21

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






字符间多出若干空行。
作者: 思想之翼    时间: 2023-9-15 23:22

回复 2# xczxczxcz

感谢!经测试,没有输出结果。
作者: Five66    时间: 2023-9-16 00:06

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

回复 5# 思想之翼


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

之前那\r\n换成\n
作者: 思想之翼    时间: 2023-9-16 00:48

回复 4# Five66
感谢!结果正确。欲在D:\NEWDATA\下创建结果文件,如何修改?
作者: Five66    时间: 2023-9-16 01:51

回复 8# 思想之翼


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

还有之前结果多出空行那时,如果改成了printf(s),s中有%号之类的字符会出错,得换成printf(\"%%s\",s)这完整式
作者: xczxczxcz    时间: 2023-9-16 01:56

本帖最后由 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"));})
复制代码

作者: 77七    时间: 2023-9-16 11:24

  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万行打开一个窗口,并行处理




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2