Seite 1 von 2

txt datei einlesen - mit split zuteilen

Verfasst: 11. Mai 2007 08:26
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

Verfasst: 11. Mai 2007 08:59
von Christian81
Aber wo liegt das Problem?
QIODevice::readLine() benutzen und zerlegen.

Verfasst: 11. Mai 2007 09:07
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

Verfasst: 11. Mai 2007 09:48
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

Verfasst: 11. Mai 2007 09:50
von macman
count()

Verfasst: 11. Mai 2007 09:50
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??

Verfasst: 11. Mai 2007 09:54
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

Verfasst: 11. Mai 2007 10:01
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!

Verfasst: 11. Mai 2007 10:15
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

Verfasst: 11. Mai 2007 10:29
von Christian81
Langsam weiss ich echt nicht mehr was ich hier noch schreiben soll... :(
SCHAU ENDLICH IN DIE DOKU zu QTextStream::readLine() !

Verfasst: 11. Mai 2007 10:36
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

Verfasst: 11. Mai 2007 10:40
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.

Verfasst: 11. Mai 2007 10:44
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.

Verfasst: 11. Mai 2007 10:51
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.

Verfasst: 11. Mai 2007 10:58
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.