Path: blob/main/src/utils/importio/NamedColumnsParser.cpp
169678 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file NamedColumnsParser.cpp14/// @author Daniel Krajzewicz15/// @author Michael Behrisch16/// @date Fri, 19 Jul 200217///18// A parser to retrieve information from a table with known column19/****************************************************************************/20#include <config.h>2122#include <map>23#include <string>24#include <utils/common/UtilExceptions.h>25#include <utils/common/StringUtils.h>26#include "NamedColumnsParser.h"272829// ===========================================================================30// method definitions31// ===========================================================================32NamedColumnsParser::NamedColumnsParser() {}333435NamedColumnsParser::NamedColumnsParser(const std::string& def,36const std::string& defDelim,37const std::string& lineDelim,38bool prune, bool ignoreCase)39: myLineDelimiter(lineDelim), myAmCaseInsensitive(ignoreCase) {40reinitMap(def, defDelim, prune);41}424344NamedColumnsParser::~NamedColumnsParser() {}454647void48NamedColumnsParser::reinit(const std::string& def,49const std::string& defDelim,50const std::string& lineDelim,51bool prune, bool ignoreCase) {52myAmCaseInsensitive = ignoreCase;53reinitMap(def, defDelim, prune);54myLineDelimiter = lineDelim;55}565758void59NamedColumnsParser::parseLine(const std::string& line) {60myLineParser = StringTokenizer(line, myLineDelimiter);61}626364std::string65NamedColumnsParser::get(const std::string& name, bool prune) const {66PosMap::const_iterator i = myDefinitionsMap.find(name);67if (i == myDefinitionsMap.end()) {68if (myAmCaseInsensitive) {69i = myDefinitionsMap.find(StringUtils::to_lower_case(name));70}71if (i == myDefinitionsMap.end()) {72throw UnknownElement("Element '" + name + "' is missing");73}74}75int pos = (*i).second;76if (myLineParser.size() <= pos) {77throw OutOfBoundsException();78}79std::string ret = myLineParser.get(pos);80checkPrune(ret, prune);81return ret;82}838485bool86NamedColumnsParser::know(const std::string& name) const {87PosMap::const_iterator i = myDefinitionsMap.find(name);88if (i == myDefinitionsMap.end()) {89if (myAmCaseInsensitive) {90i = myDefinitionsMap.find(StringUtils::to_lower_case(name));91}92}93if (i == myDefinitionsMap.end()) {94return false;95}96int pos = (*i).second;97return myLineParser.size() > pos;98}99100101bool102NamedColumnsParser::hasFullDefinition() const {103return (int)myDefinitionsMap.size() == myLineParser.size();104}105106107void108NamedColumnsParser::reinitMap(std::string s,109const std::string& delim,110bool prune) {111if (myAmCaseInsensitive) {112s = StringUtils::to_lower_case(s);113}114myDefinitionsMap.clear();115int pos = 0;116StringTokenizer st(s, delim);117while (st.hasNext()) {118std::string next = st.next();119checkPrune(next, prune);120myDefinitionsMap.insert(std::map<std::string, int>::value_type(next, pos++));121}122}123124125void126NamedColumnsParser::checkPrune(std::string& str, bool prune) const {127if (!prune) {128return;129}130std::string::size_type idx = str.find_first_not_of(" ");131if (idx != std::string::npos) {132str = str.substr(idx);133}134idx = str.find_last_not_of(" ");135if (idx != std::string::npos && idx != str.length() - 1) {136str = str.substr(0, idx + 1);137}138}139140141/****************************************************************************/142143144