2017-02-12 8 views
1

ich mit einigen SpaltenWie Daten aus einer bestimmten Spalte in einer Textdatei lesen

name,age,address,gender 

Ich weiß, dass ich mit getline(); eine Zeile zugreifen kann eine Textdatei habe, aber wenn ich die Zeichenfolge mit der get Daten, die getline(); zurückgegeben Ich möchte eine bestimmte Spalte lesen. Wie mache ich das ?

Ich sah eine Lösung für dieses Problem, aber es war in Java, die ich weiß noch nicht, so habe ich beschlossen, diese für ein c schreiben ++

+0

Willkommen bei stackoverflow.com. Bitte nehmen Sie sich etwas Zeit, [die Hilfeseiten] (http://stackoverflow.com/help) zu lesen, besonders die Abschnitte mit dem Namen ["Welche Themen kann ich hier fragen?"] (Http://stackoverflow.com/help/) on-topic) und ["Welche Art von Fragen sollte ich vermeiden zu fragen?"] (http://stackoverflow.com/help/dont-ask). Auch bitte [nehmen Sie die Tour] (http://stackoverflow.com/tour) und [lesen Sie, wie man gute Fragen stellt] (http://stackoverflow.com/help/how-to-ask). Zuletzt erfahren Sie, wie Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können. –

+2

Textdateien haben keine Spalten. Textdateien haben Linien. Sie müssen die "Spalten" selbst "dekodieren". –

Antwort

1

Ob Sie in Java oder C++ fragen, wird der Ansatz ähnlich sein.

Nachdem Sie die gesamte Zeile gelesen haben. Teilen Sie die Zeile mit ihrem Begrenzer.

In Java ist es nur

line.split(","); 

In C++ können Sie str.find(",") verwenden, um die Position des Kommas zu bekommen. Teilen Sie dann die abgegrenzten Token ab.

Setzen Sie eine count Variable, um die Anzahl der Token zu zählen, die Sie bisher begrenzt haben, um zur gewünschten Spalte zu gelangen.

1

Der Ansatz Antwort ist das gleiche: Zeile der Datei Zeile gelesen und Tokenize, während ich das zweite Element des Arrays nehme, wenn ich die zweite Spalte sehen möchte. Es kann verbessert werden, weil es viele Kopien macht, aber die Idee ist hier.

#include <sstream> 
#include <string> 
#include <boost/algorithm/string.hpp> 

std::string line; 
vector<string> strs; 
std::ifstream infile("thefile.txt"); 
while (std::getline(infile, line)) 
{ 
    strs.clear(); 
    boost::split(strs,line,boost::is_any_of("\t")); 
    cout<<"age ="<<strs[1]<<endl; 
} 
+0

Dies ist sehr ineffizient. –

+0

Ja, es könnte verbessert werden, aber das zeigt, wie die Dinge als erster Schnitt funktionieren. – Gabriel

+1

Sie sollten zumindest vor übermäßigen Zuweisungen und Kopien warnen. –

0

Sie können auch die C-Zeichenfolge analysieren (wenn Sie STL-Strings verwenden, kopieren Sie die C-Zeichenfolge in ein char-Array!) Verwenden Sie STRTOK. Es funktioniert ziemlich gut, obwohl die Notwendigkeit für eine separate Kopie aufgrund der Tatsache ist, dass strtok ändert die Zeichenfolge sowie einige statische Speicher (oder vielleicht thread-lokalen Speicher; Ich würde nicht darauf angewiesen)

Verwandte Themen