// ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- size_t ChValidation::ReadDataFile(const std::string& filename, char delim, Headers& headers, Data& data) { std::ifstream ifile(filename.c_str()); std::string line; // Count the number of lines in the file then rewind the input file stream. size_t num_lines = std::count(std::istreambuf_iterator<char>(ifile), std::istreambuf_iterator<char>(), '\n'); ifile.seekg(0, ifile.beg); size_t num_data_points = num_lines - 3; // Skip the first two lines. std::getline(ifile, line); std::getline(ifile, line); // Read the line with column headers. std::getline(ifile, line); std::stringstream iss1(line); std::string col_header = ""; while (std::getline(iss1, col_header, delim)) headers.push_back(col_header); size_t num_cols = headers.size(); // Resize data data.resize(num_cols); for (size_t col = 0; col < num_cols; col++) data[col].resize(num_data_points); // Read the actual data, one line at a time. size_t row = 0; while (std::getline(ifile, line)) { std::stringstream iss(line); for (size_t col = 0; col < num_cols; col++) iss >> data[col][row]; row++; } return row; }
void process_properties(Feature & feature, Headers const& headers, Values const& values, Locator const& locator, Transcoder const& tr) { auto val_beg = values.begin(); auto val_end = values.end(); auto num_headers = headers.size(); for (std::size_t i = 0; i < num_headers; ++i) { std::string const& fld_name = headers.at(i); if (val_beg == val_end) { feature.put(fld_name,tr.transcode("")); continue; } std::string value = mapnik::util::trim_copy(*val_beg++); int value_length = value.length(); if (locator.index == i && (locator.type == geometry_column_locator::WKT || locator.type == geometry_column_locator::GEOJSON) ) continue; bool matched = false; bool has_dot = value.find(".") != std::string::npos; if (value.empty() || (value_length > 20) || (value_length > 1 && !has_dot && value[0] == '0')) { matched = true; feature.put(fld_name,std::move(tr.transcode(value.c_str()))); } else if (csv_utils::is_likely_number(value)) { bool has_e = value.find("e") != std::string::npos; if (has_dot || has_e) { double float_val = 0.0; if (mapnik::util::string2double(value,float_val)) { matched = true; feature.put(fld_name,float_val); } } else { mapnik::value_integer int_val = 0; if (mapnik::util::string2int(value,int_val)) { matched = true; feature.put(fld_name,int_val); } } } if (!matched) { if (csv_utils::ignore_case_equal(value, "true")) { feature.put(fld_name, true); } else if (csv_utils::ignore_case_equal(value, "false")) { feature.put(fld_name, false); } else // fallback to string { feature.put(fld_name,std::move(tr.transcode(value.c_str()))); } } } }