title: How to parse csv using boost::spirit
body: <p>I have this csv line </p>
  
  <pre><code>std::string s = R"(1997,Ford,E350,"ac, abs, moon","some "rusty" parts",3000.00)";
  </code></pre>
  
  <p>I can parse it using <code>boost::tokenizer</code>:</p>
  
  <pre><code>typedef boost::tokenizer&lt; boost::escaped_list_separator&lt;char&gt; , std::string::const_iterator, std::string&gt; Tokenizer;
  boost::escaped_list_separator&lt;char&gt; seps('\\', ',', '\"');
  Tokenizer tok(s, seps);
  for (auto i : tok)
  {
      std::cout &lt;&lt; i &lt;&lt; std::endl;
  }
  </code></pre>
  
  <p>It gets it right except token "rusty" should have double quotes which are getting stripped.</p>
  
  <p>Here is my attempt to use boost::spirit</p>
  
  <pre><code>boost::spirit::classic::rule&lt;&gt; list_csv_item = !(boost::spirit::classic::confix_p('\"', *boost::spirit::classic::c_escape_ch_p, '\"') | boost::spirit::classic::longest_d[boost::spirit::classic::real_p | boost::spirit::classic::int_p]);
  std::vector&lt;std::string&gt; vec_item;
  std::vector&lt;std::string&gt;  vec_list;
  boost::spirit::classic::rule&lt;&gt; list_csv = boost::spirit::classic::list_p(list_csv_item[boost::spirit::classic::push_back_a(vec_item)],',')[boost::spirit::classic::push_back_a(vec_list)];
  boost::spirit::classic::parse_info&lt;&gt; result = parse(s.c_str(), list_csv);
  if (result.hit)
  {
    for (auto i : vec_item)
    {
      cout &lt;&lt; i &lt;&lt; endl;
     }
  }
  </code></pre>
  
  <p>Problems:</p>
  
  <ol>
  <li><p>does not work, prints the first token only</p></li>
  <li><p>why boost::spirit::classic? can't find examples using Spirit V2</p></li>
  <li><p>the setup is brutal .. but I can live with this</p></li>
  </ol>
  
  <p>** I really want to use <code>boost::spirit</code> because it tends to be pretty fast</p>
  
  <p>Expected output:</p>
  
  <pre><code>1997
  Ford
  E350
  ac, abs, moon
  some "rusty" parts
  </code></pre>
  
  <p>3000.00</p>