2017-01-03 5 views
0

Ich möchte die Spaltennummer wissen, wenn eine Überschrift angegeben ist.Wie wird die Spaltennummer in C++ abgerufen?

Zum Beispiel für S Mac Bonded State SIS Qos(DS-US) CPE MAC address IP Address

Spalte 1 ist S, 2 ist Mac, 3 ist Bonded, 4 ist State, 5 ist SIS, 6 ist Qos(DS-US), 7 ist CPE, 8 ist MAC address und 9 ist IP Address

Das Problem ist, wenn die Aufteilung basierend auf Speicherplatz " ", MAC und Adresse als verschiedene Spalten betrachtet werden, die nicht korrekt ist.

Die ersten 3 Zeilen der Datei Ich bin Parsen

S/C/CH-S/CG/CH Mac Bonded State  SIS Qos(DS-US) CPE MAC address  IP Address 
12/0/18-1/0/0  1  4x4 Operational 3.0 120M/12M  0 000f.c22a.7014 10.135.148.24 
12/0/0-1/0/4  1  4x4 Operational 3.0 120M/12M  0 1121.10fc.3993 10.135.148.50 
12/0/8-1/0/0  1  4x4 Operational 3.0 120M/12M  0 1121.81fc.1234 10.135.148.43 

Die Säulen sind immer in der gleichen Position ausgerichtet ist, so kann dies eine Lösung sein, aber ich weiß nicht, wie die Positionen zu erhalten.

Was ist der beste Weg, um das Problem zu lösen?

+4

Könnte es Tabs zwischen den Feldern, die Sie nicht sehen? –

+0

Könnten Sie die ersten 3-4 Zeilen der Datei posten, die Sie analysieren möchten? Und bitte posten Sie es auch auf http://pastebin.com/, damit wir die Datei wörtlich sehen können. –

+0

Nein, es gibt keine Tab-Felder. – user2314946

Antwort

0

Sie könnten einen anderen Begrenzer verwenden, um die Spalten zu teilen. ZB anstelle eines Leerzeichens (" ") können Sie ein Komma (",") oder einen Bindestrich ("-") verwenden. Ich würde vorschlagen, etwas zu verwenden, das wahrscheinlich an keiner anderen Stelle in der Datei verwendet wird, um Fehler zu vermeiden.

+0

Ich kann die Daten nicht ändern, ich kann es nur analysieren – user2314946

+0

vielleicht könnten Sie einige if-Anweisungen und temporäre Variablen verwenden, um nach bestimmten Überschriften zu suchen, vorausgesetzt, Sie wissen im Voraus, was die Überschriften sein werden. Angenommen, die erste temp-Eingabevariable gibt Ihnen "MAC" und die nächste temp-Eingabevariable "Adresse", dann gruppieren Sie sie in eine Spalte. Es ist keine elegante Lösung, aber es könnte funktionieren. – Sphics

+0

Aber das funktioniert nicht, wenn ich die Spaltennummer der IP-Adresse wissen muss, weil es 2 Spalten für die MAC-Adresse zählt. Dies funktioniert nur, wenn ich alle Überschriften vorher kenne. – user2314946

0

Verwendung boost::algorithm::split_regex:

std::vector<std::string> result; 
std::string str = "S Mac Bonded State  SIS Qos(DS-US) CPE MAC address" 
boost::algorithm::split_regex(result, str, regex(" ")) ; 

Wenn Sie mehr als ein weißen Räume als delimeter annehmen mögen, nur regex verwenden "\s{2,}"

+0

Ich kann nicht 2 Leerzeichen verwenden, da einige Spalten nur durch ein einzelnes Leerzeichen getrennt sind – user2314946

+1

In diesem Fall gibt es keine Möglichkeit zu unterscheiden, ob ein einzelnes Leerzeichen ein Spaltentrennzeichen oder ein Teil eines Spaltennamens ist. Ziehen Sie in Betracht, Trennzeichen zu ändern, wie andere vorschlagen. – pSoLT

0

Sie sollen das auf Spaltenpositionen basierend Split tun.

Der erste Artikel beginnt in Spalte 1 und endet in Spalte 18, der zweite Artikel beginnt in Spalte 19 und endet in Spalte 25 usw.

Sie die Spaltung in zwei Phasen:

Phase 1:

Split die Linie basierend auf Spaltenpositionen, die Ihnen:

  • "12/0/18-1/0/0 "
  • "1 "
  • "4x4 "
  • "Operational "
  • "3.0 "
  • "120M/12M "
  • "0 "
  • "000f.c22a.7014"
  • "10.135.148.24"

Phase 2:

Streifen tra e ling Räume, die in Folge hat:

  • "12/0/18-1/0/0"
  • "1"
  • "4x4"
  • usw.
+0

Wie man die Positionen ableitet? – user2314946

+0

@ user2314946 die Positionen sind festgelegt.Lesen Sie den zweiten Abschnitt meiner Antwort: _Der erste Artikel beginnt in Spalte 1 und endet in Spalte 18, der zweite Artikel beginnt in Spalte 19 und endet in Spalte 25 usw. –

Verwandte Themen