本文主要实现的是输入文件地址,以字符串的形式读取csv文件中的数据(正数、负数、科学计数法数据混合),在将这多种形式的数据转化成float。
vector<vector<vector<float>>> c;
vector<vector<float> >a;
vector<float>b;
inline void file_to_string(vector<string> &record, const string& line, char delimiter);
inline float string_to_float(string str);
void read(string data_path)
{
vector<string> row;
string line;
string filename;
ifstream in(data_path);
if (in.fail()) { cout << "File not found" <<endl; return ; }
while(getline(in, line) && in.good() )
{
file_to_string(row, line, ',');
for(int i=0, leng=row.size(); i<leng; i++){
b.push_back(string_to_float(row[i]));
}
a.push_back(b);
b.clear();
}
c.push_back(a);
a.clear();
in.close();
return ;
}
inline void file_to_string(vector<string> &record, const string& line, char delimiter)
{
int linepos=0;
char c;
int linemax=line.length();
string curstring;
record.clear();
while(linepos<linemax)
{
c = line[linepos];
if(isdigit(c)||c=='.'||c=='e'||c=='-'){
curstring+=c;
}
else if(c==delimiter&&curstring.size()){
record.push_back(curstring);
curstring="";
}
++linepos;
}
if(curstring.size())
record.push_back(curstring);
return;
}
inline float string_to_float(string str){
int i=0,len=str.length();
float sum=0;
bool ifneg=0;
while(i<len){
if(str[i]=='-'){
++i;
ifneg=1;
}
if(str[i]=='.') break;
sum=sum*10+str[i]-'0';
++i;
}//整数部分转化
++i;
float t=1,d=1;
bool ife=0;
while(i<len){
if(str[i]=='e'){
ife=1;
break;
}
d*=0.1;
t=str[i]-'0';
sum+=t*d;
++i;
}//小数部分转化
++i;
int mi=0;
bool ifmineg=0;
while(i<len){
if(str[i]=='-'){
++i;
ifmineg=1;
}
mi=mi*10+str[i]-'0';
++i;
}//若是科学计数法的数据,指数部分转化
if(ifmineg==1||ife==1){
sum=sum*pow(10,-1*mi);
}
else if(ifmineg==0||ife==1){
sum=sum*pow(10,mi);
}
if(ifneg==1){
sum=-1*sum;
}
return sum;
}