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


一楼的代码完成两个功能,fr.exe是把文件中每组连续换行符(1-n)替换为空格,也就是把多行连一行,其间用空格分隔,但留下一个行尾空格;sed.exe只是给输出结果最后加一个空行。
不用第三方,直接用系统内置的脚本引擎jscript/vbs/ps均可轻松拿下本帖,试试如下包装jscript的批处理脚本...
以下代码存为test.bat,命令行两种用法》
   test.bat "输入数据文件" 可屏显输出结果
   test.bat  "输入数据文件">"输出结果文件" 可将屏显结果写入文件
  1. @set @v=1 //&(if "%~1" neq "" cscript /e:jscript "%~f0"<"%~1")&exit/b
  2. WSH.echo( WSH.stdin.readall().replace(/[\r\n]+/g,' ').slice(0,-1) );
复制代码
如果不苛求用空格作分隔符,用纯P也可拿下本帖...
6楼的问题可用1楼的代码跑几遍自己的示例即明其果。
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-3-18 22:53 编辑

回复 8# 77七

先看如下纯P代码...
  1. @echo off &(for /f "delims=" %%a in (' findstr /n ".*" "%~1" ') do (
  2. set "s=%%a"&setlocal enabledelayedexpansion &set "s=!s:*:=!"
  3. if "!s!" neq "" for /f "tokens=1 delims=:" %%n in ("%%~a") do if %%n equ 1 (set/p="!s!"<nul) else (set/p=",!s!"<nul)
  4. endlocal
  5. ))>"%~1.new"&exit/b
复制代码
如不计较源文件中空行和!等特殊字符须被保全的问题,用延迟变量一路护航,累加读入的各行子段,最后经echo一口气写出,的确用纯P很轻松...
否则的话,须在循环体内反复开关变量延迟,而!v!续命%v%在循环体内不好弄,那就告别缓存,拜托set/p在同一行随吃随吐吧,但set/p输出容不了前导空格
而改为后缀空格又会给输出行留下一个空格尾巴...这就是以上代码采用‘非空格’字符作分隔符的故事由来
...敬待用纯P能解此题者....
1

评分人数

TOP

回复 10# 77七

有解了...用最后一行序号管控输出方法即可,最后一行要改用echo...

TOP

本帖最后由 aloha20200628 于 2024-3-21 21:19 编辑


用8万行数据文件测试获取文件总行数,结果是find方法比纯P循环遍历方法至少快了20倍
如果输出文件末尾无须空行,可将第4行代码中的&echo,删除
保全源文件中空行虽对本帖题型无实际意义,但对其他应用场合可能是必须...作为通用范式还是给一个力求全速的纯P版本如下
  1. @echo off &for /f %%n in ('find /c /v ""^<"%~1" ') do set/a "n=%%n"
  2. (for /f "delims=" %%a in (' findstr /n ".*" "%~1" ') do (
  3. set "s=%%a"&set/a "n-=1"&setlocal enabledelayedexpansion &set "s=!s:*:=!"
  4. if "!s!" neq "" (if !n! equ 0 (set/p="!s!"<nul&echo,) else (set/p="!s! "<nul))
  5. endlocal
  6. ))>"%~1.new"&exit/b
复制代码
如果源文件中间无空行,可用13楼的代码打底再给一个力求全速的纯P版本如下
  1. @echo off &for /f %%n in ('find /c /v ""^<"%~1" ') do set/a "n=%%n"
  2. (for /f "usebackq delims=" %%a in ("%~1") do (
  3. set "s=%%a"&set/a "n-=1"&setlocal enabledelayedexpansion
  4. if !n! equ 0 (set/p="!s!"<nul&echo,) else (set/p="!s! "<nul)
  5. endlocal
  6. ))>"%~1.new"&exit/b
复制代码
...感谢与13楼切磋
2

评分人数

TOP

返回列表