2016-11-01 2 views
3

wenn ich die stdin Eingang haben, wie folgt:Parsing von stdin mit C++, Monat, Jahr

2014-01-23, AA, 20 
2014-05-30, BB,2 //notice that I might have optional space 
2015-03-24, CC, 5 
//... 
//... and so on 

Wie schreibe ich ein Programm in C++, die die Monat und Jahr, effizient analysieren und auch nachfolgendes Feld? Ich bin wirklich von diesem Parsing-Problem festgefahren.

Was ich mit dem folgenden Feld machen möchte, wird AA, 20 als eine Karte gespeichert. Also map[AA]=20 so weiter. Ich kann das selbst machen. Aber ich kann nicht herausfinden, wie man es liest und analysiert. Bitte helfen.


Versuch:

int year, month; 
int num; 
string key; 
map<string, int> mapping; 
string s; 
getline(cin,s, '-'); 
year=stoi(s); 
getline(cin,s, '-'); 
month=stoi(s); 
getline(cin,s, ','); 
//reading the AA, BB, CC field; 
getline(cin,s, ','); 
for (int i=0; i<s.size(); i++); 
    if (s[i]==' ') s.erase(i,1); 
key=s; 
//now, reading the number field following AA,BB, CC 
getline(cin,s,'\n'); 
for (int i=0; i<s.size(); i++); 
    if (s[i]==' ') s.erase(i,1); 
num=stoi(s); 
mapping[key]=num; 
+1

Sie müssen diesen einen Schritt nach dem anderen machen. Schreiben Sie zuerst ein Programm, das jede Textzeile Zeile für Zeile liest. Schritt zwei: Pars jede Zeile von Text in die einzelnen Felder. Schritt drei: parse das erste Feld in seine Komponente, Jahr, Monat und Tag. Problem gelöst. Siehst du wie einfach es war? –

+0

ja, das ist einfach. Aber mein Code ist ein bisschen lang. – wrek

+0

Es gibt ein altes vulkanisches Sprichwort: Je länger der Code, desto wahrscheinlicher ist es, dass es einen Fehler hat. –

Antwort

1

Eine weitere Option std::regex oder Boost.Regex verwendet, wenn Sie auf einem "alten" Compiler sind

Spiel die Linie mit diesem

(\d{4})-(\d{2})-(\d{2}),\s*(.+),\s*(.+) 

dann erhalten Jahr , Monat, Tag, erstes Feld, zweites Feld in \ 1, \ 2, \ 3, \ 4, \ 5 bzw.

+0

Wenn ich eine sehr große Menge an Daten habe (viele Zeilen zu lesen), denken Sie, diese Methode wäre immer noch effizient? – wrek

+1

Kommt drauf an. Der einzige Weg, dies zu wissen, ist das Benchmarking. Ein kompilierter Regex kann wiederverwendet werden und hat daher eine ziemlich gute Leistung und kann im Gegensatz zu einem festen Parser leicht geändert werden. –

+0

Dies könnte eine dumme Frage sein. Wie verwende ich '\ d {4}) - (\ d {2}) - (\ d {2}), \ s * (. +), \ S * (. +)' Mit Regex? – wrek

0

Versuchen Sie folgendes:

#include <bits/stdc++.h> 
using namespace std; 

int main(){ 
    string s; 
    char c; 
    int x; 
    cin >> s >> c >> x; 
    s = s.substr(0,s.length() - 2); 
    cout << s << " " << c << " " << x << endl; 
    return 0; 
}