Wie parse csv mit boost::spirit

Habe ich diese csv-Zeile

std::string s = R"(1997,Ford,E350,"ac, abs, moon","some "rusty" parts",3000.00)";

Kann ich parse es mit boost::tokenizer:

typedef boost::tokenizer< boost::escaped_list_separator<char> , std::string::const_iterator, std::string> Tokenizer;
boost::escaped_list_separator<char> seps('\', ',', '\"');
Tokenizer tok(s, seps);
for (auto i : tok)
{
    std::cout << i << std::endl;
}

Es ist richtig, außer token "rusty" haben sollten doppelte Anführungszeichen, die sind immer abgestreift.

Hier ist mein Versuch, die Verwendung von boost::spirit

boost::spirit::classic::rule<> 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<std::string> vec_item;
std::vector<std::string>  vec_list;
boost::spirit::classic::rule<> 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<> result = parse(s.c_str(), list_csv);
if (result.hit)
{
  for (auto i : vec_item)
  {
    cout << i << endl;
   }
}

Probleme:

  1. funktioniert nicht, druckt die erste token nur

  2. warum boost::spirit::classic? kann nicht finden, Beispiele mit Geist V2

  3. setup ist brutal .. aber damit kann ich Leben, mit dieser

** Ich möchte wirklich zu verwenden boost::spirit weil es dazu neigt, ziemlich schnell

Erwartete Ausgabe:

1997
Ford
E350
ac, abs, moon
some "rusty" parts

3000.00

  • Ich sehe nicht, wie Sie behandeln würde ""rusty"" als gültige Eingabe. Wenn quoted strings sind ok, dann würde ich erwarten, dass "embedded ""quotes"" like this", aber nicht unerwartet "" (leere Zeichenkette), vorkommend in einem Feld.
  • Ich habe bearbeitet den string-input, so dass die Anführungszeichen besser machen Sinn, hoffe ich.
  • Ich glaube nicht, es macht jetzt mehr Sinn. Die Anzahl der Angebote ist unsymmetrisch. Warum nimmst du nicht die erwartete Leistung?
  • Gerade gebucht und erwartete Ausgabe
  • Ich glaube nicht, dass es eine vernünftige Art und Weise zu interpretieren, dass die Eingabe auf diese Weise. Die 'embedded' Zitate müssen escaped werden ("" oder z.B. \") die eine oder andere Weise, sonst wird der scan nicht möglich zu entscheiden, ob das Ende der Zeichenkette erreicht wurde? Ich denke nicht, dass eine CSV-engine behandelt es dieser Weg.
  • Wenn Sie MS Excel ersetzen Sie das Trennzeichen durch Tabulatoren kopieren Sie die Zeile und fügen Sie in einem Excel-sheet. Es ist korrekt analysiert

InformationsquelleAutor user841550 | 2013-08-21
Schreibe einen Kommentar