Seite 1 von 1
Bestimmte Bereiche einer Textdatei einlesen
Verfasst: 10. Dezember 2010 15:50
von Ragan
Hallo,
nachdem ich hier letztesmal so schnell Hilfe bekommen habe, möchte ich es gleich nocheinmal versuchen.
Folgender Sachverhalt:
Ich möchte aus eine Textdatei, die folgendermaßen aufgebaut ist
Code: Alles auswählen
CAPACITY : 100
NODE_COORD_SECTION
1 73 39
2 67 91
3 39 21
4 3 9
5 97 15
6 91 65
7 55 75
8 55 71
9 57 85
10 21 15
11 47 57
12 51 97
13 11 11
14 43 59
15 63 69
16 55 77
17 35 11
18 27 91
19 49 25
20 29 93
21 71 27
22 31 43
23 27 9
24 67 99
25 87 81
26 23 81
27 89 33
28 71 91
29 19 77
30 65 77
31 87 79
32 19 83
33 1 59
34 55 7
DEMAND_SECTION
1 0
2 23
3 3
4 24
5 15
6 15
7 24
8 7
9 25
10 13
11 5
12 7
13 5
14 14
15 13
16 5
17 24
18 15
19 9
20 16
21 13
22 16
23 13
24 24
25 20
26 23
27 20
28 3
29 15
30 12
31 19
32 4
33 15
34 1
DEPOT_SECTION
aus dem Bereich Node_Coord_Section die Spalten 2 und 3 jeweils in ein Array speichern sowie die Saplte 2 aus Demand Section. Den Wert für Capacity möchte ich in eine integer-variable speichern.
Bis jetzt kann ich einzelne Zeilen auslesen mit QTextstream, aber das hilft mich noch nicht weiter.
Wenn jemand Rat hat wäre ich ihm sehr dankbar

Verfasst: 10. Dezember 2010 15:57
von pfid
Wie du schon sagtest, zeilenweise einlesen und dann eben auseinander nehmen

Verfasst: 10. Dezember 2010 16:02
von Ragan
Was würdest du für ein Datenformat vorschlagen? Jede Zeile in ein QStringList?
Verfasst: 10. Dezember 2010 16:50
von upsala
Das kommt doch auch darauf an, wie das weiterverarbeiten willst.
Verfasst: 10. Dezember 2010 17:00
von Ragan
Im Endeffekt möchte ich obige Datei in folgendes Format überführen:
Code: Alles auswählen
82 76 0
96 44 19
50 5 21
49 8 6
13 7 19
29 89 7
58 30 12
84 39 16
14 24 6
2 39 16
3 82 8
5 10 14
98 52 21
84 25 16
61 59 3
1 65 22
88 51 18
91 2 19
19 32 1
93 3 24
50 93 8
98 14 12
5 42 4
42 9 8
61 62 24
9 97 24
80 55 2
57 69 20
23 15 15
20 70 2
85 60 14
98 5 9
Verfasst: 10. Dezember 2010 17:25
von upsala
Also jede Zeile 1 String?
Verfasst: 10. Dezember 2010 17:26
von Ragan
Ja das wäre gut, ich möchte die zweite und dritte Spalte von oben, und die zweite Spalte von unten in dem Format vom letzten post in einen String schreiben, genau
Verfasst: 10. Dezember 2010 17:43
von kater
Du kennst die Funktion split() ? Wenn Geschwindigkeit eine Rolle spielt solltest du QByteArray das QString nutzen.
Verfasst: 10. Dezember 2010 17:44
von Ragan
Im Moment versuche ich es wie folgt:
Code: Alles auswählen
QString fileName;
QString line1,line2,line3;
fileName = QFileDialog::getOpenFileName(this, tr("Datei öffnen"), "./Koordinaten", "Text-Dateien (*.txt);;");
if (!fileName.isEmpty()){
QFile file(fileName);
if (file.open(QFile::ReadOnly | QFile::Text)){
QTextStream stream(&file);
int k1,k2=0;
int coord=0;
coord_liste.clear();
demand_liste.clear();
stream.skipWhiteSpace();
while(!stream.atEnd()){
stream.readLine();
stream >> line1 >> line2 >> line3;
if(coord==1)
{
coord_liste.insert(k1,line2+" "+line3);
k1++;
}
if(coord==2)
{
demand_liste.insert(k2,line2);
k2++;
}
if(line1=="NODE_COORD_SECTION") coord=1;
if(line1=="DEMAND_SECTION") coord=2;
if(line1=="DEPOT_SECTION ") break;
}
klappt nicht so gut
bei coord_liste fehlt die erste zeile und die ltzte is zu viel:
Code: Alles auswählen
96 44
50 5
49 8
13 7
29 89
58 30
84 39
14 24
2 39
3 82
5 10
98 52
84 25
61 59
1 65
88 51
91 2
19 32
93 3
50 93
98 14
5 42
42 9
61 62
9 97
80 55
57 69
23 15
20 70
85 60
98 5
1 0
bei demand_liste wird nur jede zweite zeile eingelesen und zu viele:
Verfasst: 16. Dezember 2010 12:30
von ituser
hast du schon mal versucht alle werte vorerst mal in ein Array zu speichern?
ZB:
Code: Alles auswählen
int Array[50][50];
int a,b;
stream->operator>>(Array[a][b];
und dann kannst daraus mit
Qstring.append("Array[1][2]").append.......
deine konstrukte zusammen bauen wie du willst
Verfasst: 16. Dezember 2010 13:35
von RHBaum
int Array[50][50];
Sind wir hier im Mittelalter ?
Ansonsten, wenn deine Daten ohne Probs in den Hauptspeicher passen, rein damit .... also in ne Container-Struktur einlesen !
Deine "Zeile" also ein eintrag besteht immer aus 2 Werten richtig ?
Dann wuerd ich das auch so modellieren !
typedef std::pair<int,int> EntryT;
beim Container kommt drauf an, wie du auf die Werte nachher zugreifen willst.
brauchst die daten am stuck, bzw nen Schnellen index zugriff:
std::vector<EntryT> myArray;
willst soweiso nur von von nach hinten usw durchlaufen -> iterieren, dann langt eine list:
std::list<EntryT> myList;
Alternativ kannst natuerlich auch Q-COntainer nehmen....
Ciao ...