Board logo

标题: [数值计算] 批处理如何将文本里的多行数字相加并输出总和等于指定数值时所在的行数和行内容 ... [打印本页]

作者: ads350668398    时间: 2016-11-13 10:18     标题: 批处理如何将文本里的多行数字相加并输出总和等于指定数值时所在的行数和行内容 ...

本帖最后由 pcl_test 于 2016-11-24 08:36 编辑

逐行计算输出和值所在的行
12
10
8
4
6
15
11
12
4
6
8
1
11
7
14如果是 13
6
6


逐行相加计算和值输出特定数值的行~
例子:
目的 得到和为 129的行数 和所在的行的内容 【15行 14】
如果是13!【16行 6 并和值134】一起显示输出
!!
其实要用乘法乘法会涉及到大数这~~¥%……&
关于大数的那个帖子真真是#¥%&*%
作者: ads350668398    时间: 2016-11-13 20:17

本帖最后由 ads350668398 于 2016-11-13 21:40 编辑
  1. echo
  2. for /f "tokens=1-3 delims=  " %%a in (mss.txt) do (
  3.     set /a "m+=%%a"
  4. )
  5. set m
  6. pause
复制代码
关于【code】 网页不能自己加么
作者: ads350668398    时间: 2016-11-14 15:52

本帖最后由 ads350668398 于 2016-11-14 16:25 编辑

没有办法
这样可以不
12
10 8
4 6 15
........
金字塔形
每一行计算
和129相比较
  1. @echo off&setlocal enabledelayedexpansion
  2. set s
  3. :a
  4. set /a s+=1
  5. (for /f %%1 in (mss.txt)do (set /a wind+=1
  6. if !wind! leq %s% set /p=%%1 <nul
  7. if !wind!==%s% echo.&&set wind=0))>1232.txt&pause&goto a
复制代码
怎么输出金字塔
作者: ads350668398    时间: 2016-11-14 22:51

谁会做金字塔
作者: Batcher    时间: 2016-11-15 08:46

回复 2# ads350668398


    不能。网页无法自动判断。
作者: ads350668398    时间: 2016-11-15 09:24

本帖最后由 pcl_test 于 2016-11-15 10:06 编辑
  1. PUBLIC=C:\Users\Public
  2. SESSIONNAME=Console
  3. SystemDrive=C:
  4. SystemRoot=C:\Windows
  5. TEMP=C:\Users\ADMINI~1\AppData\Local\Temp
  6. TMP=C:\Users\ADMINI~1\AppData\Local\Temp
  7. USERDOMAIN=PC201605020431
  8. USERNAME=Administrator
  9. USERPROFILE=C:\Users\Administrator
  10. windir=C:\Windows
  11. windows_tracing_flags=3
  12. windows_tracing_logfile=C:\BVTBin\Tests\installpackage\csilogfile.log
  13. ALLUSERSPROFILE=C:\ProgramData
  14. ……
复制代码
请按任意键继续. . .
这是什么意思 我在做实验 脚本 怎么出了这个东西??
仔细发现 我输出的【M】终于是按着逐行相加的 但是怎么会这么多英文 在中间》???????????
大神指点啊 为什么是在 9行 也就是逐行加到【m=82后】???
作者: Batcher    时间: 2016-11-15 09:28

回复 6# ads350668398


    脚本发出来看看,可能不小心执行了 set 命令。
作者: ads350668398    时间: 2016-11-15 09:36

  1. @echo off&setlocal enabledelayedexpansion
  2. echo %date%%time%
  3. @echo off
  4. for /f "tokens=1-2" %%i in (mss.txt) do (set /a m+=%%i & set %m% & ping -n 2 127.1>nul)
  5. pause
复制代码

作者: GNU    时间: 2016-11-15 09:51

回复 8# ads350668398
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo %date%%time%
  4. for /f "tokens=1-2" %%i in (mss.txt) do (
  5.     set /a m+=%%i
  6.     echo !m!
  7. )
  8. pause
复制代码

作者: GNU    时间: 2016-11-15 09:53

setlocal enabledelayedexpansion 启用变量延迟扩展之后,for循环内部的变量应该使用 !m! 而不是 %m%
作者: ads350668398    时间: 2016-11-15 10:54

回复 9# GNU


    谢谢大神门的关注 我加了一行  if /i !m! geq 129 echo !s! !m!
输出的是 大于129的【所有行】 !!要做到只输出 大于等于129的【一行】怎么做啊??
作者: ads350668398    时间: 2016-11-15 19:20

本帖最后由 ads350668398 于 2016-11-15 19:24 编辑
  1. for /f "tokens=1-6" %%i in (!ab!.txt) do (
  2.     set /a s+=1
  3.     set /a m+=%%i
  4.     if /i !m! geq %aa% echo !s! %%i% !m!
  5. )  
  6. set ii=!i!
  7. for /f "delims=" %%1 in ("%s% %ii% %m%") do (
  8.    
  9.      echo %%1
复制代码
关于变量【%%i】的传递和正确写法  晕菜了  
%i %%i%% %!i!%  %%%i%%%
用【set ii=!i!】 和不用对后面的FOR的【%%i】的写法。。。有变化么
作者: GNU    时间: 2016-11-15 21:49

回复 11# ads350668398


符合条件之后就跳出for循环
  1. for /f "tokens=1-6" %%i in (!ab!.txt) do (
  2.     set /a s+=1
  3.     set /a m+=%%i
  4.     if /i !m! geq %aa% (
  5.         echo !s! %%i !m!
  6.         goto :next
  7.     )
  8. )
  9. :next
  10. pause
复制代码

作者: GNU    时间: 2016-11-15 21:57

回复 12# ads350668398


set ii=!i! 这种写法可能无法实现你希望的目的
%%i 在1到5行代码之间有效
for循环结束之后的第六行%%i没有值,用!i!也没有值。
作者: ads350668398    时间: 2016-11-15 22:51

回复 14# GNU


    谢谢 括号里面就OK了
作者: ads350668398    时间: 2016-11-23 14:02     标题: 第二次运算错误为什么

  1. @echo &setlocal enabledelayedexpansion
  2. set /p aa=和值
  3. set /p ab=要读取的文本名
  4. echo %date%%time%
  5. setlocal enabledelayedexpansion
  6. echo %date%%time%
  7. for /f "tokens=1-6 delims= " %%i in (!ab!.txt) do (
  8.    set /a s+=1
  9.    set /a m+=%%i
  10.   if /i !m! geq %aa% echo !s! %%i% !m! >>1h.txt
  11.   
  12. )  
  13. for /f "delims=" %%1 in (1h.txt) do (
  14. echo %%1 >>1hh.txt
  15. start 1hh.txt
  16. del 1h.txt
  17.      goto a
  18. )
  19. :a
  20. ::pause&call 逐行相加4.bat&exit
复制代码
为什么第二次三次运行的时候 不能正确 运算
ab.txt
1
2
5
9
8
6
7
9
5
作者: GNU    时间: 2016-11-23 22:43

我猜是没有做变量初始化
把参与计算的变量在代码开头设置成 0 试试看
作者: ads350668398    时间: 2016-11-24 08:28

我好菜鸟啊 555
作者: ads350668398    时间: 2016-11-30 11:53

回复 17# GNU


    if /i !m! geq %aa% echo !s! %%i%     echo %%%j% !m! >>1h.txt
求困惑 %i 和%j中间输出为什么没有空格啊??
作者: GNU    时间: 2016-12-1 11:41

回复 19# ads350668398


把以下信息分别发出来:
最新的完整代码
希望得到的结果
实际得到的结果
作者: ads350668398    时间: 2016-12-2 08:35

本帖最后由 ads350668398 于 2016-12-2 08:54 编辑

回复 20# GNU


   a. txt原本
1 13  2
2 16  2
3 15  1
4 3  1
5 1  2
6 3  1
7 16  2
8 9  1
输出字符中间为什么没有空格啊?
  1. @echo &setlocal enabledelayedexpansion
  2. for /f "tokens=2-6 delims= " %%i in (a.txt) do (
  3.    set /a s+=1
  4.    set /a m+=%%j
  5.   if /i !m! geq 5 echo !s! %%i%     echo %%%j% !m! >>1h.txt
  6.   
  7. )  
复制代码
输出
3 151 5
4 31 6
5 12 8
6 31 9
7 162 11
8 91 12

【希望结果】
3 15 1 5
4 3 1 6
5 1 2 8
6 3 1 9
7 16 2 11
8 9 1 12
作者: CommandBatCmd    时间: 2016-12-2 10:12

回复 21# ads350668398

"delims=空格",空格已被过滤掉!
  1. @echo &setlocal enabledelayedexpansion
  2. for /f "tokens=2-6 delims= " %%i in (a.txt) do (
  3.    set /a s+=1
  4.    set /a m+=%%j
  5.   if /i !m! geq 5 echo !s! %%i %     echo %%%j% !m! >>1h.txt
  6. )
  7. pause
复制代码

作者: GNU    时间: 2016-12-2 11:27

回复 21# ads350668398

if /i !m! geq 5 echo !s! %%i%     echo %%%j% !m! >>1h.txt

for循环的控制变量应该是:
%%i
%%j
你的写法是错误的
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=2-6 delims= " %%i in (a.txt) do (
  4.     set /a s+=1
  5.     set /a m+=%%j
  6.     if /i !m! geq 5 echo !s! %%i %%j !m!>>1h.txt
  7. )
复制代码

作者: ads350668398    时间: 2016-12-2 11:50

回复 23# GNU

set kk=
    if /i !m! geq %aa% echo !s! %%i%   %%kk%   %%j% !m! >>1h.txt
这个空给KK 也能想的结果 晕了
作者: GNU    时间: 2016-12-2 13:23

回复 24# ads350668398


    已经说过了,%%i% 这种写法是错误的。至于最终代码怎么写,你高兴就好。
作者: ads350668398    时间: 2016-12-2 14:33

回复 25# GNU


    恩




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