diff --git a/include/mapnik/csv/csv_grammar.hpp b/include/mapnik/csv/csv_grammar.hpp index 39819eb9e..cefeb1f1f 100644 --- a/include/mapnik/csv/csv_grammar.hpp +++ b/include/mapnik/csv/csv_grammar.hpp @@ -41,11 +41,15 @@ struct csv_line_grammar : qi::grammar> *("\"\"" | unesc_char | ~char_('"')) >> '"' + text = *(unesc_char | (char_ - char_(_r1))) + ; + quoted = omit[char_("\"'")[_a = _1]] >> text(_a)[_val = _1] >> lit(_a) ; - - //http://stackoverflow.com/questions/7436481/how-to-make-my-split-work-only-on-one-real-line-and-be-capable-to-skeep-quoted-p/7462539#7462539 BOOST_SPIRIT_DEBUG_NODES((line)(column)(quoted)); } private: qi::rule line; qi::rule column; // no-skip - qi::rule quoted; + qi::rule text; + qi::rule, std::string()> quoted; qi::symbols unesc_char; }; diff --git a/plugins/input/csv/csv_datasource.cpp b/plugins/input/csv/csv_datasource.cpp index 066220095..8252c73a4 100644 --- a/plugins/input/csv/csv_datasource.cpp +++ b/plugins/input/csv/csv_datasource.cpp @@ -141,7 +141,7 @@ csv_datasource::csv_datasource(parameters const& params) if (!inline_string_.empty()) { std::istringstream in(inline_string_); - parse_csv(in,escape_, separator_, quote_); + parse_csv(in, escape_, separator_, quote_); } else { @@ -474,11 +474,12 @@ void csv_datasource::parse_csv(T & stream, { // special handling for varieties of quoting that we will enounter with json // TODO - test with custom "quo" option +#if 0 // TODO - remove if (has_json_field && (quo == "\"") && (std::count(csv_line.begin(), csv_line.end(), '"') >= 6)) { csv_utils::fix_json_quoting(csv_line); } - +#endif auto values = mapnik::parse_line(csv_line, sep); unsigned num_fields = values.size();