C++实现读取文件计算各个指标的均值

读取txt文件中的原始数据求取其平均值

  求取平均值,方差,最大值,最小值在数据统计时都有这样的需求,大多数情况下,我们使用的excel去记录、统计。但是,使用excel处理存在需要记录表格,处理时也多有不便。因此,使用程序去保存数据然后在计算其各个均值,方差等是一个不错的选择。这篇文章将讲述如何读取txt文件并计算各个指标的平均值,处理完后将各个指标的平均值保存到文件中。

1. 待处理的数据格式
  待处理的数据保存在txt文件中,文件内各行的数据格式为“1:2,3,4,5,6,7” 。txt文件中的一部分内容如下。

iteration:SR,time,RC,length,steerNum, steerAngle,validNode
1500:0.457413,0.111678,375,55,1105.61,568
1500:0.575414,0.111513,366,51,1023.69,735
1500:0.608413,0.0994784,370,51,913.212,718
1500:0.427024,0.12779,371,50,1150.11,589
1500:0.620775,0.134866,335,49,1189.52,801
1500:0.549381,0.10758,337,50,968.22,727
1500:0.552739,0.10758,337,50,968.22,727
1500:0.623211,0.112868,348,48,975.176,757
1500:0.677805,0.113413,326,46,939.06,869
1500:0.41309,0.108229,361,48,935.094,568
1500:0.530252,0.109444,366,52,1024.4,649
2000:0.73891,0.119222,356,53,1137.38,799
2000:0.943567,0.130331,359,50,1172.98,901
2000:0.939581,0.106619,350,48,921.192,974
2000:0.997464,0.110099,342,50,990.895,978
2000:1.11928,0.11617,337,51,1066.45,1029
2000:0.846223,0.113847,358,51,1045.12,885
2000:1.01644,0.134841,368,56,1359.19,992
2000:0.891703,0.117,359,49,1031.94,912
2000:1.04781,0.143481,331,48,1239.68,1009
2000:1.02112,0.124093,361,51,1139.17,1057
2000:1.01084,0.14559,345,49,1284.1,892

2. 编程得到其各个指标的平均值
  首先读取txt文件,然后按照“1:2,3,4,5,6,7” 这种格式分割,接着求取各个指标的平均值,最后将各个指标的平均值写入txt文件。C++代码如下所示。

**********读取text文件中的数据,统计各行数据的平均值**************************************/
/*************处理的数据格式: text文件的数据格式为 1:2,3,4,5,6,7***********************/
/************* 输出:保存到text文件中*********************************************************/ 
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
int main() 
{ 
 	char s[200];
	fstream  outfile;
	outfile.open("D:\\实验\\trialresult-BVGRRTstar.txt",ios::in);//创建一个fstream文件流对象,这里填写自己的文件地址 
	if(outfile.fail())
	{
		cout<<"Open file fail !!!"<<endl;
		return 1;
	}
	vector<string> words; //创建一个vector<string>对象
	string  line; //保存读入的每一行
 	while(outfile.getline(s,100))//会自动把\n换行符去掉 ,读取txt文件保存到vector<string> words中 
 	{
 		line=s;
		words.push_back(line); 
 	}
 	outfile.close();
 	cout << "共有单词数目:" << words.size() << endl; //测试一下 读取的各行是否正确 
 	for(auto line1:words)
 		cout<<line1<<endl;
 	//利用1:2,3,4进行分割 
	//这一部分分割的是1:2,3,4,5,6,7这类格式的数据。其中2,3,4,5,6,7都是需要统计的指标,1是变量(例如本文是次数)
	//也就是不同的次数下各个指标的平均值 
 	int success_num=0,iter_total_num=0; //用来统计每个迭代的总试验次数和成功次数
	vector<double> trial_res(6,0); //用来计算每种迭代的运行时间,路径异常值,路径长度的总和 ,转弯数,转弯角度,有效节点 
 	double  iteration,run_time,RC,path_length,success_rate,steer_num,steer_angle,valid_node_num;
 	vector<vector<double>> mean_data;
 	int pre_iter=150; 
 	for(auto str:words)
 	{
 		int pos=str.find(":",0);
		string s1=str.substr(0,pos);
		iteration=atoi(s1.c_str());
		cout<<iteration<<endl;
		if(pre_iter!=iteration) //表示该迭代次数已经完结了,需要统计了 
		{
			//TODO:统计 
			vector<double> temp;
			temp.push_back(static_cast<double>(success_num)/static_cast<double>(iter_total_num));
			temp.push_back(trial_res[0]/static_cast<double>(success_num));
			temp.push_back(trial_res[1]/static_cast<double>(success_num));
			temp.push_back(trial_res[2]/static_cast<double>(success_num));
			temp.push_back(trial_res[3]/static_cast<double>(success_num));
			temp.push_back(trial_res[4]/static_cast<double>(success_num));
			temp.push_back(trial_res[5]/static_cast<double>(success_num));
			mean_data.push_back(temp);
			iter_total_num=0; 
			success_num=0;
			for(int i=0;i<trial_res.size();i++)
				trial_res[i]=0;
			pre_iter=iteration;
			
		}
		iter_total_num++; 
		string remained=str.substr(pos+1,str.size()-(pos+1));
		cout<<remained<<endl;
		if(remained=="Fail")
		{
			//TODO:不成功的次数统计 	
			
		}
		else 
		{
			success_num++;
			remained+=","; //扩展方便后面循环使用 
			int size1=remained.size(); 
			//规划成功的次数统计
			int cnt=0;
			for(int i=0; i<size1; i++,cnt++)
     		{
        		pos=remained.find(",",i);
        		if(pos<size1)
        		{
        			std::string s2=remained.substr(i,pos-i);
        			double temp=atof(s2.c_str());
        			trial_res[cnt]+=temp;
        			i=pos;
        		}
     		}
		} 
	}
	vector<double> temp;
	temp.push_back(static_cast<double>(success_num)/static_cast<double>(iter_total_num));
	temp.push_back(trial_res[0]/static_cast<double>(success_num));
	temp.push_back(trial_res[1]/static_cast<double>(success_num));
	temp.push_back(trial_res[2]/static_cast<double>(success_num));
	temp.push_back(trial_res[3]/static_cast<double>(success_num));
	temp.push_back(trial_res[4]/static_cast<double>(success_num));
	temp.push_back(trial_res[5]/static_cast<double>(success_num));
	mean_data.push_back(temp);
	for(int i=0;i<mean_data.size();i++)
	{
		for(int j=0;j<mean_data[i].size();j++)
		{
			cout<<mean_data[i][j]<<"	";
		}
		cout<<endl;
	}
	int iter_arr[11]={150,300,500,1000,1500,2000,2500,3000,3500,4000,4500};
	fstream  infile;
	infile.open("D:\\实验\\dealmeans-BVGRRTstar.txt",ios::out); //保存最后各个平均值的文件 
	if(infile.fail())
	{
		cout<<"open infile error !"<<endl;
		return 2;
	}
	infile<<"iteration"<<" "<<"SR"<<" "<<"time"<<" "<<"RC"<<" "<<"length"<<"steerNum"<<" "\
	<<"steerAngle"<<" "<<"validNode"<<" "<<endl; //统计的各项数据 
	for(int i=0;i<mean_data.size();i++) //写到文件中 
	{
		infile<<iter_arr[i];
		for(int j=0;j<mean_data[i].size();j++)
		{
			infile<<" ";
			infile<<mean_data[i][j];
		}
		infile<<endl;
	}
 	return 0;
}

3. 处理得到的结果

iteration SR time RC lengthsteerNum steerAngle validNode
150 0 nan nan nan nan nan nan
300 0 nan nan nan nan nan nan
500 0.122449 0.114791 0.117961 351.667 49 1042.36 314
1000 0.857143 0.273175 0.116057 362.762 50.1429 1048.97 485.214
1500 0.918367 0.536468 0.116647 352.889 49.5333 1040.12 694.733
2000 0.979592 0.928424 0.118666 350.312 50.2708 1076.51 924.708
2500 1 1.50221 0.117876 348.673 49.4082 1049.35 1132.24
3000 1 2.31401 0.11712 349.796 49.7551 1050.2 1358.22
3500 1 2.6394 0.118135 347.469 49.8163 1061.94 1553.12
4000 1 3.37406 0.117458 346.102 49.3061 1043.33 1822.12
4500 1 4.22709 0.117043 343.082 48.5102 1024.64 2052.43

4. 总结
  利用程序处理数据得到其均值带来了一些方便,但是本程序只能处理特殊格式(1:2,3,4,5,6,7)的文本文件。其他格式需要改一下代码。将来可能会朝着自定义标识分割和自定义处理方式努力。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值