标题: [其他] 【已解决】批处理提速:按行拆分文件,并以行首字符命名 [打印本页]
作者: 思想之翼 时间: 2023-9-15 18:26 标题: 【已解决】批处理提速:按行拆分文件,并以行首字符命名
本帖最后由 思想之翼 于 2023-9-16 03:57 编辑
【示例】
D:\DATA\data.txt记录格式如下:
029=书 生 气
123=书 生 气
按行分割文件,并以等号左侧字符为文件名,等号右侧字符转置成竖排。
结果为:
029.txt记录格式为:
书
生
气
123.txt记录格式为:
书
生
气
【解决方案】- @echo off
- chcp 65001
- for /f "useback tokens=1* delims==" %%a in ("D:\DATA\data.txt") do (
- (for %%c in (%%b) do (
- echo %%c
- ))>"D:\DATA\%%a.txt"
- )
- pause
复制代码
【问题】
上述纯批速度太慢,能用第三方工具提速吗?
作者: xczxczxcz 时间: 2023-9-15 20:04
powershell 勿套娃- [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
不知行否,会在当前目录下创建结果文件
不知道会不会快点- @echo off
-
- set "filepath=D:\DATA\data.txt"
-
- if not exist "%filepath%" echo file not found&pause&exit/b
- set "filepath=%filepath:\=\\%"
- 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\"}}}"
- 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# 思想之翼
加一组括号即可- [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
- @echo off
- chcp 65001 >nul
- rem 假设总行数不超过 2000000
- %1 (for /l %%l in (0,50000,2000000) do (start /min "" "%~f0" rem %%l))&exit
-
- if %~2 equ 0 (
- set str=
- ) else (
- set str=skip=%~2
- )
- for /f "%str% useback tokens=1* delims==" %%a in ("D:\DATA\data.txt") do (
- if exist "D:\DATA\%%a.txt" (
- exit
- )
- (for %%c in (%%b) do (
- echo %%c
- ))>"D:\DATA\%%a.txt"
- )
- exit
复制代码
5万行打开一个窗口,并行处理
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |