#include <iostream>
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include<math.h>
using namespace std;
struct Database
{
int num;
double time;
double area;
double height;
};
struct Ave
{
int num;
double average;
double std;
double rsd;
};
int main()
{
ifstream inFile("D:/FILE/F0.csv", ios::in);//数据文件夹所在位置,将文件格式改为.csv,中间用/隔开//
if (!inFile)
{
cout << "打开文件失败!" << endl;
exit(1);
}
string line;
getline(inFile, line);
vector<struct Database> test1,test2,test3;
while (getline(inFile, line))
{
Database a,b,c;
string field;
istringstream sin(line);
getline(sin, field, ',');
a.num=atoi(field.c_str());
getline(sin, field, ',');
a.time=atof(field.c_str());
getline(sin, field, ',');
a.area=atof(field.c_str());
getline(sin, field,',');
a.height=atof(field.c_str());
test1.push_back(a);
getline(sin, field, ',');
b.num=atoi(field.c_str());
getline(sin, field, ',');
b.time=atof(field.c_str());
getline(sin, field, ',');
b.area=atof(field.c_str());
getline(sin, field,',');
b.height=atof(field.c_str());
test2.push_back(b);
getline(sin, field, ',');
c.num=atoi(field.c_str());
getline(sin, field, ',');
c.time=atof(field.c_str());
getline(sin, field, ',');
c.area=atof(field.c_str());
getline(sin, field);
c.height=atof(field.c_str());
test3.push_back(c);
}
double max1=0.0;
double max2=0.0;
double max3=0.0;
for (int i = 0; i < 150; i++)
{
if(test1[i].time>35.0&&test1[i].time<37.0&&test1[i].area>max1) max1=test1[i].area;
if(test2[i].time>35.0&&test2[i].time<37.0&&test2[i].area>max2) max2=test2[i].area;
if(test3[i].time>35.0&&test3[i].time<37.0&&test3[i].area>max3) max3=test3[i].area;
}
double mid;
if((max1-max2)*(max1-max3)<0.0) mid=max1;
if((max2-max1)*(max2-max3)<0.0) mid=max2;
if((max3-max1)*(max3-max2)<0.0) mid=max3;
double k1=mid/max1,k2=mid/max2,k3=mid/max3;
int length1=test1.size();
if(test2.size()>length1) length1=test2.size();
if(test3.size()>length1) length1=test3.size();
for (int i = 0; i < length1; i++)
{
test1[i].area=test1[i].area*k1;
test2[i].area=test2[i].area*k2;
test3[i].area=test3[i].area*k3;
}
for (int i = 0; i < 280; i++)
{
int len1=test1.size();
if(test2.size()>length1) length1=test2.size();
if(test3.size()>length1) length1=test3.size();
if(i==len1) break;
int sum=0;
if(test1[i].time==0) sum++;
if(test2[i].time==0) sum++;
if(test3[i].time==0) sum++;
int a[3]={1,1,1},b[4];
double t[3];
t[0]=test1[i].time;
t[1]=test2[i].time;
t[2]=test3[i].time;
if(test1[i].time>test2[i].time) a[0]++;
else a[1]++;
if(test1[i].time>test3[i].time) a[0]++;
else a[2]++;
if(test2[i].time>test3[i].time) a[1]++;
else a[2]++;
double cha=0.0,min,max,mid2;
for (int j = 0; j < 3; j++)
{
b[a[j]]=j+1;
if(a[j]==1) min=t[j];
if(a[j]==2) mid2=t[j];
if(a[j]==3) max=t[j];
}
Database cr;
cr.time=0.0;
cr.num=0;
cr.height=0.0;
cr.area=0.0;
if(sum==0){
cha=max-min;
if(cha<0.1) continue;
if(mid2-min>0.1) {
if(b[2]==1||b[3]==1) test1.insert(test1.begin()+i,cr);
if(b[2]==2||b[3]==2) test2.insert(test2.begin()+i,cr);
if(b[2]==3||b[3]==3) test3.insert(test3.begin()+i,cr);
}
else {
if(b[3]==1) test1.insert(test1.begin()+i,cr);
if(b[3]==2) test2.insert(test2.begin()+i,cr);
if(b[3]==3) test3.insert(test3.begin()+i,cr);
}
}
if(sum==1){
cha=max-mid2;
if(cha<0.1) continue;
else{
if(b[3]==1) test1.insert(test1.begin()+i,cr);
if(b[3]==2) test2.insert(test2.begin()+i,cr);
if(b[3]==3) test3.insert(test3.begin()+i,cr);
}
}
}
vector<Ave> res;
int length2=test1.size();
if(test2.size()>length1) length2=test2.size();
if(test3.size()>length1) length2=test3.size();
int one=length2-test1.size(),two=length2-test2.size(),thr=length2-test3.size();
Database eg1;
eg1.time=0.0;eg1.num=0;eg1.height=0.0;eg1.area=0.0;
for (int i = 0; i < one; i++) test1.push_back(eg1);
for (int i = 0; i < two; i++) test2.push_back(eg1);
for (int i = 0; i < thr; i++) test3.push_back(eg1);
for (int i = 0; i < length2; i++)
{
Ave eg;
eg.num=i;
int sum=0;
if(test1[i].time==0.0) sum++;
if(test2[i].time==0.0) sum++;
if(test3[i].time==0.0) sum++;
if(sum==2) continue;
double a=0.0,b=0.0,c=0.0;
if(sum==1){
eg.average=(test1[i].area+test2[i].area+test3[i].area)/2;
if(test1[i].time!=0.0) a=(test1[i].area-eg.average)*(test1[i].area-eg.average);
if(test2[i].time!=0.0) b=(test2[i].area-eg.average)*(test2[i].area-eg.average);
if(test3[i].time!=0.0) c=(test3[i].area-eg.average)*(test3[i].area-eg.average);
eg.std=sqrt(a+b+c);
eg.rsd=eg.std/eg.average;
res.push_back(eg);
}
if(sum==0){
eg.average=(test1[i].area+test2[i].area+test3[i].area)/(3-sum);
if(test1[i].time!=0.0) a=(test1[i].area-eg.average)*(test1[i].area-eg.average);
if(test2[i].time!=0.0) b=(test2[i].area-eg.average)*(test2[i].area-eg.average);
if(test3[i].time!=0.0) c=(test3[i].area-eg.average)*(test3[i].area-eg.average);
eg.std=sqrt((a+b+c)/(2-sum));
eg.rsd=eg.std/eg.average;
if(eg.rsd>0.25){
Database canshu;
canshu.area=0.0;canshu.height=0.0;canshu.num=0;canshu.time=0.0;
double rsd12=sqrt(pow(test1[i].area-((test1[i].area+test2[i].area)/2),2)+pow(test2[i].area-((test1[i].area+test2[i].area)/2),2))/((test1[i].area+test2[i].area)/2);
double rsd13=sqrt(pow(test1[i].area-((test1[i].area+test3[i].area)/2),2)+pow(test3[i].area-((test1[i].area+test3[i].area)/2),2))/((test1[i].area+test3[i].area)/2);
double rsd23=sqrt(pow(test2[i].area-((test2[i].area+test3[i].area)/2),2)+pow(test3[i].area-((test2[i].area+test3[i].area)/2),2))/((test2[i].area+test3[i].area)/2);
if(rsd12<rsd13){
if(rsd12<rsd23){
test3[i]=canshu;
eg.average=(test1[i].area+test2[i].area)/2;
eg.rsd=rsd12;
eg.std=rsd12*eg.average;
}
else{
test1[i]=canshu;
eg.average=(test2[i].area+test3[i].area)/2;
eg.rsd=rsd23;
eg.std=rsd23*eg.average;
}
}
else{
if(rsd13<rsd23){
test2[i]=canshu;
eg.average=(test1[i].area+test3[i].area)/2;
eg.rsd=rsd13;
eg.std=rsd13*eg.average;
}
else{
test1[i]=canshu;
eg.average=(test2[i].area+test3[i].area)/2;
eg.rsd=rsd23;
eg.std=rsd23*eg.average;
}
}
}
res.push_back(eg);
}
}
inFile.close();
ofstream outFile;
outFile.open("D:/FILE/res5.csv", ios::out);//数据输出文件地址,输出的格式也为.csv,可以根据自己需求更改文件格式//
outFile<<"number"<<","<<"time"<<","<<"area"<<","<<"height"<<","<<" "<<",";
outFile<<"number"<<","<<"time"<<","<<"area"<<","<<"height"<<","<<" "<<",";
outFile<<"number"<<","<<"time"<<","<<"area"<<","<<"height"<<","<<" "<<",";
outFile<<"average"<<","<<"std"<<","<<"rsd"<<","<<endl;
for (int i = 0; i < res.size(); i++)
{
if(res[i].rsd<0.25){
outFile<<test1[res[i].num].num<<","<<test1[res[i].num].time<<","<<test1[res[i].num].area<<","<<test1[res[i].num].height<<","<<" "<<",";
outFile<<test2[res[i].num].num<<","<<test2[res[i].num].time<<","<<test2[res[i].num].area<<","<<test2[res[i].num].height<<","<<" "<<",";
outFile<<test3[res[i].num].num<<","<<test3[res[i].num].time<<","<<test3[res[i].num].area<<","<<test3[res[i].num].height<<","<<" "<<",";
outFile<<res[i].average<<","<<res[i].std<<","<<res[i].rsd<<endl;
}
}
outFile.close();
system("pause");
}
研一茶学数据处理
于 2022-03-04 17:47:02 首次发布