找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26582|回复: 8

[数值计算] [已解决]批处理如何计算出txt文本里每一行数字平均数

[复制链接]
发表于 2020-8-1 11:33:35 | 显示全部楼层 |阅读模式
本帖最后由 hepeisheng 于 2020-8-7 23:42 编辑

在一个文件夹裏,有一个txt文件,和一个bat文件,双击bat文件,读取txt文件每行的数字求平均数,并写在txt文件的后面,如正确答案=-0.69%。有些正数可能没有前面的+号。

txt文本格式如下:

1.85%

1.68%

1.27%

+1.02%

+0.82%

+0.81%

+0.00%

+0.00%

-0.08%

-0.12%

-0.24%

-0.31%

-0.32%

-0.37%

-0.37%

-0.39%

-0.56%

-0.61%

-0.64%

-0.64%

-0.65%

-1.06%

-1.41%

-1.44%

-1.94%

-1.98%

-2.16%

-2.30%

-2.42%

-8.01%
发表于 2020-8-2 10:48:26 | 显示全部楼层
本帖最后由 yhcfsr 于 2020-8-2 10:52 编辑

系统要求:WIN7及以上
文件类型:bat
  1. @Powershell "& {[ScriptBlock]::Create("'#' + ([io.file]::ReadAllText('%~f0',[text.encoding]::Default))").Invoke()}" & pause & exit
  2. $files = [io.directory]::GetFiles('./', '*.txt', 'AllDirectories');#获取所有txt文件

  3. foreach($file in $files)
  4. {
  5.     [double] $result  = 0.0;
  6.     [int]    $count   = 0;
  7.     [System.Collections.ArrayList] $content = [io.file]::ReadAllLines($file);#读取文件

  8.     foreach($line in $content)
  9.     {
  10.         if($line -match '%')
  11.         {
  12.             $result +=[double]($line -replace '%');
  13.             $count++;   
  14.         }   
  15.     }

  16.     [void] $content.Add("`r`n={0:0.00}%" -f ($result/$count));
  17.     [io.file]::WriteAllLines($file, $content);//保存文件
  18. }
复制代码

评分

参与人数 1技术 +1 收起 理由
hepeisheng + 1 正确,可以用。

查看全部评分

发表于 2020-8-2 11:15:52 | 显示全部楼层
回复 2# yhcfsr


    复杂化了,再简化,应该2一3句就可以了。
发表于 2020-8-2 21:32:20 | 显示全部楼层
  1. import re, numpy as np
  2. with open('2.txt','r+') as file:
  3.     file.write(str(np.average([float(result.group(0)) for i in file if isinstance((result := re.search('[+-]?\d?\.?\d+(?=%)',i)),re.Match)])))
复制代码

评分

参与人数 1技术 +1 收起 理由
hepeisheng + 1 没有反应。

查看全部评分

发表于 2020-8-2 23:11:30 | 显示全部楼层
回复 4# ivor


    这个是python代码?
发表于 2020-8-3 09:59:00 | 显示全部楼层
回复 5# Blakelee


    是的啊
发表于 2020-8-3 10:51:51 | 显示全部楼层
本帖最后由 amwfjhh 于 2020-8-3 11:05 编辑
  1. @if (0)==(0) echo off & setlocal enabledelayedexpansion
  2. set "nC=0" & set "nI=0" & (for /f "delims=" %%i in ('type num.txt') do ((for /f "delims=" %%a in ('cscript -nologo -e:jscript %~s0 "!nC!" "%%i" "+"') do set "nC=%%a") & set /a nI+=1 )) & cscript -nologo -e:jscript %~s0 "!nc!" "!nI!" "/" && pause && exit
  3. @end
  4. (function(args) {WScript.Echo(eval((/%/.test(args(0))?parseFloat(args(0))/100:parseFloat(args(0)))+args(2)+(/%/.test(args(1))?parseFloat(args(1))/100:parseFloat(args(1)))).toString());})(WScript.Arguments)
复制代码

评分

参与人数 1技术 +1 收起 理由
hepeisheng + 1 正确答案应该是=-0.69%,你的小数点后多了2个 ...

查看全部评分

发表于 2020-8-4 10:50:53 | 显示全部楼层
-0.69%不就是-0.0069么?
 楼主| 发表于 2020-8-4 19:43:24 | 显示全部楼层
是,但不直观。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 02:45 , Processed in 0.022250 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表