[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 neorobin 于 2014-9-2 20:12 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1-4" %%a in (a.txt) do (
  3. if /i "%%a"=="NODE" (
  4. echo %%a %%b %%c %%d
  5. ) else (
  6. for %%A in (%%b %%c %%d) do (
  7. for /f "tokens=1-2 delims=." %%p in ("%%A") do (
  8. set "L=%%p" & set "N=00!L:-=!"
  9. set /a "M=!L:-=!/1000,L>>=31"
  10. set "s=!s! !L:~0,-1!!M!.!N:~-3!%%q"
  11. )
  12. )
  13. echo %%a !s!& set "s="
  14. )
  15. )
  16. pause
复制代码

TOP

本帖最后由 neorobin 于 2014-9-2 20:11 编辑

回复 7# srj092005
cmd 不支持小数运算, 所以没有非常简单直接的方式

关键在第 8-10 行的处理, 举例:
数据: -93.526

第 7 行中 delims=.  将其以 . 为分界符分为两部分 -93  和  526

第 8 行中 00!L:-=! 为整数部分插入若干前缀 0 , 此处要求 除以 1000(=10^3) 所以至少 插入 2 (=3-1) 个 0,   93 就变成 0093

第 9 行 M=!L:-=!/1000, 取整数部分的绝对值除以 1000, 这个除法不会保留精确商的小数部分, 小数部分由第 7, 8 行保留
L>>=31 得到数据的符号, 负数 得到 -1, 否则得到 0

第 10 行:  !L:~0,-1!!M!.!N:~-3!%%q  
!L:~0,-1! 取符号,   !M! 得到数据除以 1000 后的整数部分, !N:~-3! 是取  00-0093 的最后 3 位 093,
%%q 得到 第 7 行分解出来的原小数部分 526,  结果数据就是 -0.093526

第 13 行, 不要在 & 后加 , 号

如果要变成除以 100, 第 8 行中两处 2 个 0 仍然可用 (2 > 1), 因为至少各只需 1 个 0 就行了, 如果是要除以 10000, 0 的个数 就必须增加了.
第 9 行 1000 改成 100 即可, 第 10 行 !N:~-3! 中 3 就要改成 2, 如果 除数是其他 10 的 n 次方, 以此类推.

如果要以 , 号为分隔符输出,
第 10 行改为
  1. set "s=!s!,!L:~0,-1!!M!.!N:~-3!%%q"
复制代码
第 13 行改为
  1. echo %%a,!s!& set "s="
复制代码
标题行是首行, 可以将第 2 行改为
  1. for /f "tokens=1-4 skip=1" %%a in (a.txt) do (
复制代码
将第 1 行跳过

TOP

本帖最后由 neorobin 于 2014-9-2 20:13 编辑

回复 10# srj092005

CMD 的窗口缓冲区 行数 和 列数 都是有限制的, 你可以用 MODE 命令 查看

有大量文本输出时, 把输出定向到文件, 不要在窗口中截取
  1. @echo off & setlocal enabledelayedexpansion
  2. >R.txt (
  3. for /f "tokens=1-5 delims=," %%a in (node.txt) do (
  4. for %%A in (%%c %%d %%e) do (
  5. for /f "tokens=1-2 delims=." %%p in ("%%A") do (
  6. set "L=%%p" & set "N=00!L:-=!"
  7. set /a "M=!L:-=!/1000,L>>=31"
  8. set "s=!s!,!L:~0,-1!!M!.!N:~-3!%%q"
  9. )
  10. )
  11. echo %%a,%%b!s!& set "s="
  12. )
  13. )
  14. start R.txt
  15. pause
复制代码

TOP

回复 13# terse

确实, 我写得多余了, 只需 N=00!L:-=! 就行了

TOP

回复 15# srj092005

微软提供了 帮助文件, 此帖有下载页链接

http://www.bathome.net/viewthrea ... mp;highlight=NTCMDS

此论坛的 教程&资料 区有许多文章, 其中有些知识及技巧甚至是官方帮助文件中未提及的

此论坛的许多精华帖及加分帖,挑战题等可以提供一些更深入精进学习的资源

TOP

回复 17# srj092005

在 4  楼代码中保留  if /i "%%a"=="NODE" (  ,  过滤掉那些非数据行就行了

TOP

返回列表