23 std::vector<double> values;
24 std::vector<std::string> svalues;
25 uint rows = 0,cols = 0,col_idx=0;
26 std::vector<std::vector<uint>> Idxpinf,Idxminf,Idxmissing;
27 std::set<uint> colCat;
35 std::getline(indata, line);
36 std::stringstream lineStream(line);
38 while(getline(lineStream, cell,
',')) {
40 values.push_back(stod(std::string(
"nan")));
41 Idxmissing.push_back(std::vector<uint>({rows,col_idx}));
43 cols=std::max(cols,col_idx);
47 result = std::stod(cell, &pos);
49 svalues.push_back(cell);
50 colCat.insert(col_idx);
52 cols=std::max(cols,col_idx);
55 if (pos!=cell.size()){
56 throw std::invalid_argument(
57 "Incorrect numeric format! Abort the program. The entry reads "+cell+
58 " and the position is ("+ std::to_string(rows)+
","+ std::to_string(col_idx)+
")");
60 values.push_back(result);
61 if (isinf(values.back())){
62 if (values.back()==std::numeric_limits<double>::infinity()){
63 Idxpinf.push_back(std::vector<uint>({rows,col_idx}));}
64 else {Idxminf.push_back(std::vector<uint>({rows,col_idx}));}
66 else if (isnan(values.back())){
67 Idxmissing.push_back(std::vector<uint>({rows,col_idx}));
70 cols=std::max(cols,col_idx);
76 while (std::getline(indata, line)) {
82 while(getline(lineStream, cell,
',')) {
84 if (colCat.find(col_idx)==colCat.end()){
85 values.push_back(stod(std::string(
"nan")));
88 svalues.push_back(
"");
90 Idxmissing.push_back(std::vector<uint>({rows,col_idx}));
95 result = std::stod(cell, &pos);
97 if (colCat.find(col_idx)!=colCat.end())
99 svalues.push_back(cell);
100 colCat.insert(col_idx);
104 throw std::invalid_argument(
105 "Incorrect value type! Should be numeric but non-numeric input. The entry reads "+cell+
106 " and the position is ("+ std::to_string(rows)+
","+ std::to_string(col_idx)+
")");
109 if (pos!=cell.size()){
110 throw std::invalid_argument(
111 "Incorrect numeric format! Abort the program. The entry reads "+cell+
112 " and the position is ("+ std::to_string(rows)+
","+ std::to_string(col_idx)+
")");
114 values.push_back(result);
115 if (isinf(values.back())){
116 if (values.back()==std::numeric_limits<double>::infinity()){
117 Idxpinf.push_back(std::vector<uint>({rows,col_idx}));}
118 else {Idxminf.push_back(std::vector<uint>({rows,col_idx}));}
120 else if (isnan(values.back())){
121 Idxmissing.push_back(std::vector<uint>({rows,col_idx}));
126 std::cout<<cols<<
" "<<col_idx<<std::endl;
127 throw std::invalid_argument(
"Not all rows has same number of entry! First row has "+std::to_string(cols)+
" columns but row "+std::to_string(rows)+
" has "+std::to_string(col_idx)+
" columns!" );
134 std::cout<<
"Number of rows: "<<rows<<std::endl;
135 std::cout<<
"Number of columns: "<<cols<<std::endl;
136 std::cout<<
"Number of positive infinity values: "<<Idxpinf.size()<<
". They are at " ;
137 for(
auto each :Idxpinf){
138 std::cout<<
"("<<each[0]<<
","<<each[1]<<
")"<<
" ";
140 std::cout<<std::endl;
141 std::cout<<
"Number of negative infinity values: "<<Idxminf.size()<<
". They are at ";
142 for(
auto each :Idxminf){
143 std::cout<<
"("<<each[0]<<
","<<each[1]<<
")"<<
" ";
145 std::cout<<std::endl;
146 std::cout<<
"Number of missing values: "<<Idxmissing.size()<<
". They are at ";
147 for(
auto each :Idxmissing){
148 std::cout<<
"("<<each[0]<<
","<<each[1]<<
")"<<
" ";
150 std::cout<<std::endl;
152 std::cout<<
"Columns of categorical values: Column ";
153 for (
auto idx:colCat) {std::cout<<idx<<
" ";}
154 std::cout<<std::endl;