Bestimmte Bereiche einer Textdatei einlesen

Alles rund um die Programmierung mit Qt
Antworten
Ragan
Beiträge: 10
Registriert: 9. Dezember 2010 11:43

Bestimmte Bereiche einer Textdatei einlesen

Beitrag 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 :)
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Wie du schon sagtest, zeilenweise einlesen und dann eben auseinander nehmen ;)
Ragan
Beiträge: 10
Registriert: 9. Dezember 2010 11:43

Beitrag von Ragan »

Was würdest du für ein Datenformat vorschlagen? Jede Zeile in ein QStringList?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das kommt doch auch darauf an, wie das weiterverarbeiten willst.
Ragan
Beiträge: 10
Registriert: 9. Dezember 2010 11:43

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Also jede Zeile 1 String?
Ragan
Beiträge: 10
Registriert: 9. Dezember 2010 11:43

Beitrag 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
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Du kennst die Funktion split() ? Wenn Geschwindigkeit eine Rolle spielt solltest du QByteArray das QString nutzen.
Ragan
Beiträge: 10
Registriert: 9. Dezember 2010 11:43

Beitrag 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:

Code: Alles auswählen

19
6
7
16
16
14
16
22
19
24
12
8
24
20
2
9
-1
ituser
Beiträge: 11
Registriert: 8. November 2010 11:40

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten