34#include <boost/tokenizer.hpp>
35#include <boost/locale.hpp>
36#include <boost/algorithm/string.hpp>
38#include <glib/gi18n.h>
41GncCsvTokenizer::set_separators(
const std::string& separators)
43 m_sep_str = separators;
47GncCsvTokenizer::set_enable_escape(
const bool enable)
49 m_enable_escape = enable;
53int GncCsvTokenizer::tokenize()
55 using Tokenizer = boost::tokenizer< boost::escaped_list_separator<char>>;
57 boost::escaped_list_separator<char> sep(
"\\", m_sep_str,
"\"");
63 bool inside_quotes(
false);
66 m_tokenized_contents.clear();
67 std::istringstream in_stream(m_utf8_contents);
71 while (std::getline (in_stream, buffer))
74 buffer = boost::trim_copy (buffer);
75 last_quote = buffer.find_first_of(
'"');
76 while (last_quote != std::string::npos)
79 inside_quotes = !inside_quotes;
80 else if (!m_enable_escape || buffer[ last_quote - 1 ] !=
'\\')
81 inside_quotes = !inside_quotes;
83 last_quote = buffer.find_first_of(
'"',last_quote+1);
97 auto bs_pos = line.find (
'\\');
98 while (bs_pos != std::string::npos)
100 if (! m_enable_escape)
103 line.insert (bs_pos, 1,
'\\');
109 if ((bs_pos == line.size()) ||
110 (line.find_first_of (
"\"\\n", bs_pos + 1) != bs_pos + 1))
111 line = line.substr(0, bs_pos) +
"\\\\" + line.substr(bs_pos + 1);
115 bs_pos = line.find (
'\\', bs_pos);
121 bs_pos = line.find (
"\"\"");
122 while (bs_pos != std::string::npos)
130 if (!(((bs_pos == 0) ||
131 (m_sep_str.find (line[bs_pos-1]) != std::string::npos))
133 ((bs_pos + 2 >= line.length()) ||
134 (m_sep_str.find (line[bs_pos+2]) != std::string::npos))))
136 line.replace (bs_pos, 2,
"\\\"");
137 bs_pos = line.find (
"\"\"", bs_pos + 2);
140 Tokenizer tok(line, sep);
141 vec.assign(tok.begin(),tok.end());
142 m_tokenized_contents.push_back(vec);
146 catch (boost::escaped_list_error &e)
148 throw (std::range_error N_(
"There was an error parsing the file."));
Class to convert a csv file into vector of string vectors.