txt datei einlesen - mit split zuteilen

Alles rund um die Programmierung mit Qt
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

txt datei einlesen - mit split zuteilen

Beitrag von Stash »

hallo,
danke nochmal an alle, die mir gestern bei meinem kleinen problem helfen konnten. hab es dann mit sehr viel geduld irgendwann hingebracht.

so hab jetzt leider aber ein anderes problem.

hab ne textdatei mit ungefähr folgender struktur:

+ 9999$00023$KG$ 746895609$ 48027418$ 55101018$ 48079456$ 55153631
+ 9998$ 48030377$ 55104147
+ 9998$ 48030646$ 55150845
+ 9998$ 48077343$ 55150575
+ 9998$ 48077073$ 55103877
+ 9990$30940543$ 2$ 48029700$ 55153631$ 0$5$ 746895609
+ 9990$30940544$ 1$ 48036775$ 55151143$ 0$5$ 746895609
+ 9990$30940544$ 4$ 48063981$ 55152150$ 0$5$ 746895609
+ 9990$30940544$ 6$ 48064906$ 55152388$19$5$ 746895609
+ 9990$30940544$ 7$ 48065031$ 55151875$19$5$ 746895609
+ 9990$30940544$ 8$ 48070362$ 55150693$ 0$5$ 746895609
+ 9990$30940544$ 10$ 48071488$ 55150731$19$5$ 746895609
...

und so geht des immer weiter.
will jetzt folgendes erreichen. also den anfang (die ersten 6 zeilen) sind unwichtig. aber danach würd ich gern die zeilen (vielleicht mit split) so zerlegen, dass ich bestimmte abschnitte separat speichern kann:

z. B. 2$ 48029700$ 55153631$

(die 2 ist die punktnummer, 48029700 rechtswert, 55153631 hochwert

u.s.w., dass ich halt dann drei verschiedene arrays habe, wo die ganzen daten drin sind.

nur ich hab keine ahnung wie ich des machen soll.

wäre super, wenn mir da einer einen schubs in die richtige richtung gibt bzw. mir helfen kann.

danke für die mühe.

mfg stash
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Aber wo liegt das Problem?
QIODevice::readLine() benutzen und zerlegen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

3 Arrays wird recht unübersichtlich. Definier dir halt ein struct, etwa so:

Code: Alles auswählen

struct Point {
   int n;  // Nummer
   int x;  // Rechtswert
   int y;  // Hochwert
};
Dann liest du, wie von Christian bereits erwähnt, jede Zeile einzeln ein. Diese Zeilen kannst du Splitten (als Split-Zeichen verwendest du $).
Jetzt nur noch für jeden Punkt ein Point-Objekt angelegt und in dein Array (oder QList/QVector/...). So gewährleistest du, dass selbst nach ausgiebigen Sortier-Orgien die Integrität der Daten bestehen bleibt (kannst ja mal überlegen, wie komplex es wird, wenn du immer in 3 Arrays rumwühlen musst, um nach x/y/n zu sortieren...)

Grüße
Franz
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

Beitrag von Stash »

danke erstmal für die tipps:

hab noch ne frage:

würd dem programm gerne sagen, dass er nur die zeilen auslesen soll, die nach dem split auch 8 elemente haben(die ersten 6 zeilen haben weniger).

in visual basic gab es da den ubound

gibts in qt da auch was?

danke

mfg stash
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

count()
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Manchmal frage ich mich ob die Leute überhaupt die Doku lesen... was ist trivialer als zu Testen ob die QStringList genau 8 Elemente beinhaltet??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

Beitrag von Stash »

ups richtig :)

sorry, hätt ich auch selber draufkommen können.

trotzdem merci. aber ich hab noch ein problem :).

ich lese jede einzelne zeile mit readline() ein. und dann will ich einen split ansetzen. nur das problem ist, dass ich einen textstream dann habe und split geht nur bei strings. kann ich irgendwie einen textstream in einen string konvertieren, um diesen dann anschließend zu splitten.

vielen dank

mfg stash
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Auch diese Frage wurde Dir schonmal beantwortet soweit ich mich errinnern kann.
Des Weiteren sehe ich nirgends eine Funktion readLine() die mir einen QTextStream zurückliefert.
Ausserdem gibt es immer noch (nein, sie ist nicht weggelaufen) die DOKU!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

Beitrag von Stash »

ja das mag vielleicht sein, aber gestern hab ich es anders gelöst dann:

hier auszug aus meinem code:


QString fileName = QFileDialog::getOpenFileName(0, "Open File","", "Koordinaten (*.dfk)");
QFile f(fileName);

pfad->setText(fileName);

bool ok;

if (f.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream t(&f);
while(!t.atEnd())
{
t.readLine();
...

und dann wird eingelesen.
nur ich hab halt jetzt einen TextStream. und nicht sauer sein bitte, wenn ich mit der doku nicht so zurecht komm. bin noch ziemlich neu was die sprache angeht.

mfg stash
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Langsam weiss ich echt nicht mehr was ich hier noch schreiben soll... :(
SCHAU ENDLICH IN DIE DOKU zu QTextStream::readLine() !
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

Beitrag von Stash »

Christian81 hat geschrieben:Langsam weiss ich echt nicht mehr was ich hier noch schreiben soll... :(
SCHAU ENDLICH IN DIE DOKU zu QTextStream::readLine() !

kein grund stress zu machen. aber bevor du solche sinnlosen beiträge schreibst, schreib lieber gar nichts.

trotzdem danke
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das ist kein sinnloser Beitrag - wenn Du das befolgst was dort steht wärst Du wohl schon auf die Lösung gekommen! Ich habe schon mind. zweimal darauf hingewiesen dass es in der Doku korrekt steht. Es hat absolut keinen Sinn jemanden das vorzukauen was er zu programmieren hat.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

Beitrag von Stash »

ja is ja in ordnung.

aber des mit der doku wusst ich selber.

und ich würd hier nicht im forum eine frage stellen, wenn ich in der doku die antwort finden könnte.
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Auch wenn sich Christian vielleicht manchmal im Ton verkreift, hat er doch recht.

Du schreibst selber, dass Du mit readLine den Textstream ausliest:

Code: Alles auswählen

QString fileName = QFileDialog::getOpenFileName(0, "Open File","", "Koordinaten (*.dfk)");
QFile f(fileName);

pfad->setText(fileName);

bool ok;

if (f.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream t(&f);
while(!t.atEnd())
{
t.readLine(); 
...
Und was gibt t.readLine() zurück? Da guckst du jetzt am besten mal in der Doku nach und überlegst mal wo Du dann wohl split aufrufen könntest.
Solltest Du's tatsächlich nicht raus finden, dann entferne bitte das Brett vor Deinem Kopf.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Stash
Beiträge: 29
Registriert: 9. Mai 2007 16:33

Beitrag von Stash »

ja danke, habs jetzt selber rausgekriegt.

mein fehler war dass ich den inhalt von readline erst in einem stream zwischengespeichert hab und dann ging natürlich nichts mehr. jetzt hab ich alles zusammengepackt und es geht.

nur hab jetzt mal ne ganz allgemeine frage in sachen gestaltung. ich hab vor meine ergebnisse in nem textbrowser darzustellen. nur ich will jetzt natürlich ne schöne ordnung aufbringen. textedit ist mein textbrowser


textedit->append(flur[z] + " " + QString::number(nr[z]) ...

anstatt der leerzeichen würd ich gern so einen abstand herbekommen als würd ich zweimal den tabulator drücken. gibts da n befehl in qt.
Antworten