Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Daten aus Datei einlesen u verarbeiten

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
parsi



Anmeldungsdatum: 17.01.2019
Beiträge: 13

BeitragVerfasst am: 17.01.2019, 14:40    Titel: Daten aus Datei einlesen u verarbeiten Antworten mit Zitat

Guten Tag!
Bin neu hier. QBasic ist mir nicht mehr geläufig solange ist es her ...

Deshalb meine Frage verbunden mit der Bitte um Hilfe:

Ich habe eine Datei(.txt), deren Inhalt so aussieht:

Code:
OG24000000=87uhj8e98878457384
A =-7.707199718844271E-01 B =-6.487453558135811E-01 C = 3.423453280062579E-05
 AA= 1.079886291005403E-02 BB=-1.323360580948546E-02 CC= 8.183376392655774E-07
DD= 5.818328982021319E-03 EE= 1.007412434369968E+00 FF= 2.604107416344972E-04


In der ersten Zeile steht ein Datum. Dann folgen drei weitere Zeilen mit jeweils drei Angaben. Daran schließt sich ohne Leerzeile dasselbe immer wieder an.

Ich möchte nun diese Daten auslesen, ev. ergänzen und in einer neuen Datei neu formatiert speichen.

Bitte, kann mir da ein Mitglied weiterhelfen?

freundlichst

parsi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4264
Wohnort: ~/

BeitragVerfasst am: 17.01.2019, 16:23    Titel: Antworten mit Zitat

Hallo, willkommen.
QBasic ist mir auch nicht mehr ganz so geläufig; es kann sein, dass ich bei den Antworten etwas in FreeBASIC abgleite. Aber auch dann wird es sich in FreeBASIC sehr ähnlich umsetzen lassen.

Ein bisschen problematisch ist die seltsame Formatierung der Daten mit den drei Einträgen in einer Zeile. Wenn es auf jeden Fall immer drei Einträge sind, mit Leerzeichen getrennt, lässt es sich noch reht gut handhaben (und wenn es mehr oder weniger Einträge sein können, kann man das mit leichten Anpassungen auch noch machen). Erst einmal grundsätzlich: Eine Datei kannst du mit OPEN (FOR INPUT) zum Lesen öffnen, eine Zeile liest du dann mit INPUT# ein.

Eine Zeile wie
Code:
OG24000000=87uhj8e98878457384

werte ich üblicherweise folgendermaßen aus:
Code:
DIM zeile AS STRING
DIM key AS STRING
DIM value AS STRING
DIM such AS INTEGER

OPEN "dateiname.txt" FOR INPUT AS #1
LINE INPUT #1, zeile
such = INSTR(zeile, "=")
key = LEFT$(zeile, such-1)
value = MID$(zeile, such+1)
' ...
CLOSE #1

In 'key' steht nun der Wert "OG24000000", in 'value' der Wert "87uhj8e98878457384".

Mit den folgenden Zeilen geht das dann im Prinzip genauso, nur suchst du erst ein "=" (davor steht der erste Schlüsselname), dann ein folgendes Leerzeichen (zwischen "=" und Leerzeichen steht dann der zugehörige Wert; noch aufpassen, dass nicht das Leerzeichen direkt hinter dem "=" gesucht wird). Ab dem Leerzeichen wird dann wieder das nächste "=", von dort aus das nächste Leerzeichen gesucht, usw.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
parsi



Anmeldungsdatum: 17.01.2019
Beiträge: 13

BeitragVerfasst am: 17.01.2019, 17:47    Titel: Antworten mit Zitat

@ nemored

Danke für die prompte Antwort!

1. Ja, die Formatierung ist genauso wie ich sie im Thread sehe.
2. Im Prinzip habe ich Dienen Code verstanden.
Aber: Wieso soll ich ein "=" suchen. Ist es nicht besser ein "A =" zu suchen, dann ein " B ="? Da ich drei verschiedene Daten in einer Zeile habe: Wie rücke ich da voran zum nächsten?
Im Prinzip habe ich ja sehr viele solcher 4-Zeilen-Blöcke. Wie unterscheide ich da zwischen zweien?
3. Wäre es denn eine geschickte Alternative, das ganze Text-filer so umzuformatieren, dass es mit dem basic-Befehle data einlesbar ist?

parsi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4264
Wohnort: ~/

BeitragVerfasst am: 17.01.2019, 18:40    Titel: Antworten mit Zitat

Wenn du erst "A =" suchst usw. hast du zwei "Probleme":
1) Kommt zwischen "A" und "=" ein Leerzeichen oder nicht? Das ist nämlich uneinheitlich. edit: Ich sehe gerade - vermutlich besteht der Schlüssel immer aus zwei Zeichen, ggf. mit Leerzeichen aufgefüllt.
2) Du musst dir immer den nächsten "Buchstabensatz" selbst zusammenbauen (nach "Y" kommt "Z", nach "Z" kommt "AA" ...) - und natürlich darauf bauen, dass sich deine Datei exakt daran hält.
Mit dem 'key'/'value'-Paar liest du den Schlüssel ("A", "B" ...) direkt aus der Datei; das halte ich für deutlich praktischer (und flexibler).

Mit INSTR kannst du auch die Position angeben, ab der gesucht werden soll, allerdings ist eine Zerlegung vielleicht einfacher.
Code:
DO UNTIL EOF(1)
  LINE INPUT #1, zeile          ' liest z. B. ein: 'A =-7.7071 B =-6.4874 C = 3.4234'
  such = INSTR(zeile, "=")      ' liefert '3'
  key = LEFT$(zeile, such-1)    ' liefert 'A '
  ' Den Schlüssel ohne Leerzeichen bekommst du dann mit TRIM$(key)
  value = MID$(zeile, such+1)   ' liefert '-7.7071 B =-6.4874 C = 3.4234'
  such = INSTR(zeile, " ", 2)   ' liefert '8'
  ' Falls direkt am Anfang der Zeile ein Leerzeichen steht, wurde das übersprungen.
  ' Das erste Schlüssel-Wert-Paar lautet:
  ' TRIM$(key) / TRIM$(LEFT$(value, such-1))

  zeile = MID(zeile, such+1)    ' liefert 'B =-6.4874 C = 3.4234'
  such = INSTR(zeile, "=")      ' liefert '3'
  key = LEFT$(zeile, such-1)    ' liefert 'B '
  value = MID$(zeile, such+1)   ' liefert '-6.4874 C = 3.4234'
  such = INSTR(zeile, " ", 2)   ' liefert '8'
  ' Das zweite Schlüssel-Wert-Paar lautet wiederum:
  ' TRIM$(key) / TRIM$(LEFT$(value, such-1))

  zeile = MID(zeile, such+1)    ' liefert 'C = 3.4234'
  such = INSTR(zeile, "=")      ' liefert '3'
  key = LEFT$(zeile, such-1)    ' liefert 'C '
  value = MID$(zeile, such+1)   ' liefert ' 3.4234'
  ' Das dritte Schlüssel-Wert-Paar lautet:
  ' TRIM$(key) / TRIM$(value)
LOOP

Als DATA-Zeilen halte ich es nicht für so geschickt; wenn du umformatierst, dann lieber für jedes der Daten eine eigene Zeile:
Code:
OG24000000=87uhj8e98878457384
A=-7.707199718844271E-01
B=-6.487453558135811E-01
C=3.423453280062579E-05
...

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
parsi



Anmeldungsdatum: 17.01.2019
Beiträge: 13

BeitragVerfasst am: 17.01.2019, 20:39    Titel: Antworten mit Zitat

@ nemored:

Ich glaube ich hab das begriffen wie Du das meinst.

Ich staune über den Befehl 'INSTRU', den hab' ich wohl noch nie so richtig wahrgenommen.
Es kommt durchaus auf Schnelligkeit an, denn die files lang. (Es kann auch vorkommen, dass ich nur einen Datensatz in einer mehrere Dutzend MB langen Datei suchen muss.) Ich muss also während der Suche in eine neue Datei mit neuer Formatierung schreiben.
Was schlägst Du vor? Einen Datensatz jeweils in ein Zeile? Besondere Trennzeichen benutzen?

freundlichst

parsi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4264
Wohnort: ~/

BeitragVerfasst am: 17.01.2019, 23:16    Titel: Antworten mit Zitat

Was Geschwindigkeit anbelangt, würde ich dann doch zu FreeBASIC raten; der Compiler optimiert sehr gut, und die Syntax unterscheidet sich nicht sehr (vor allem, wenn du dich sowieso neu einarbeiten musst). Ein Datensatz pro Zeile sollte meiner Einschätzung nach eine gute Geschwindigkeit liefern. Noch schneller wäre eine binäre Speicherung (wobei ich glaube, dass QBasic da noch nicht optimal unterstützt - da muss man vielleicht mit PEEK und POKE ran). Nachteil ist dann allerdings, dass man im Zweiflesfall nicht mal schnell mit einem Texteditor ran kann.

Wenn du nur einen bestimmten Datensatz suchst: Wenn(!) die Daten immer sauber von A-Z weiter über AA usw. gehen, kannst du (bei einem Datensatz pro Zeile) berechnen, welche Zeile du auslesen musst, und dann erst einmal die vorherigen Zeilen nur lesen, ohne sie auszuwerten. Damit wirst du, wenn du einen Datensatz weit hinten in der Datei benötigst, deutlich schneller. Aber es darf halt dann kein Fehler in der Datei vorliegen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
parsi



Anmeldungsdatum: 17.01.2019
Beiträge: 13

BeitragVerfasst am: 18.01.2019, 14:47    Titel: Antworten mit Zitat

@nemored:

Da habe ich wohl noch etwas Wesentliches vergessen mitzuteilen:
Die Datensätze sind alle vor dem '=' gleich. Da geht nichts von A-Z. Die unterscheiden sich nur in den numerischen Angaben.

Ich muss die erst einmal in eine günstige Form zum Auslesen (also neue Datei erstellen) und auch zum Suchen eines einzelnen Datensatzes bringen. Diese neue Datei will ich verwenden um auf die Datensätze zuzugreifen und sie in demselben Programm weiter zu verarbeiten.

freundlichst

parsi

ps:
Und noch etwas habe ich leider vergessen zu erwähnen:
Der erste Eintrag jedes Blockes (von 4 Zeilen) ist stets unterschiedlich ist also so zu sagen die unabhängige Variable, die alle Blöcke in eine willkürliche Reihenfolge bringt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
parsi



Anmeldungsdatum: 17.01.2019
Beiträge: 13

BeitragVerfasst am: 18.01.2019, 20:01    Titel: Antworten mit Zitat

Ich habe ein wenig die Formatzeichen studiert und festgestellt:
Wenn ich zu Beginn eines Blockes am Ende der 1. Zeile ein "Zeichen" entferne und dies noch 2 weitere Male in der neu erhaltenen Zeile 1 mache, dann habe ich nach 3 solcher Vorgänge einen Block in einer einzigen Zeile stehen.
Bzw. ich gehe an die erste Stelle der letzen Zeile eines Blockes und mach einen 'Rückschritt' dann springe ich an die ertse Stelle der neu gestalteten Zeile und mache wieder einen Rückschritt. Nach dem Dritten mal ist es geschafft.
Gehe ich jetzt 4 Zeilen nach unten und zum Zeilenanfang wiederholt sich alles.
Das könnte von Vorteil hinsichtlich der weiteren Bearbeitung sein.

Aber wie mache ich das. Diese Suchroutinen und Formatierungen sind mir ein Rätsel.

freundlichst
parsi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4264
Wohnort: ~/

BeitragVerfasst am: 18.01.2019, 20:32    Titel: Antworten mit Zitat

Also, wenn ich das richtig verstehe: Je drei Zeilen bilden einen Datensatz (A, B, C, AA, BB, CC, DD, EE, FF), und du willst immer drei Zeilen zusammenfassen, also den gesamten Datensatz in einer Zeile haben?

Das würde ich ganz schnell über so ein Programm machen:
Code:
DIM zeile1 AS STRING
DIM zeile2 AS STRING
DIM zeile3 AS STRING
OPEN "inputdatei.txt" FOR INPUT AS #1
OPEN "outputdatei.txt" FOR OUTPUT AS #2

' erste Zeile (Datum) einlesen und kopieren
LINE INPUT #1, zeile1
PRINT #2, zeile1

DO UNTIL EOF(1)
  ' je drei Zeilen einlesen
  LINE INPUT #1, zeile1
  LINE INPUT #1, zeile2
  LINE INPUT #1, zeile3
  ' und als eine einzige Zeile schreiben
  PRINT #2, zeile1; " "; zeile2; " "; zeile3
LOOP
CLOSE 1, 2

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
parsi



Anmeldungsdatum: 17.01.2019
Beiträge: 13

BeitragVerfasst am: 18.01.2019, 20:40    Titel: Antworten mit Zitat

@nemored:

Vier (!) Zeilen bilden einen Datensatz.
Wenn ich Z 2-4 zur ersten nehme, dann habe ich eine Zeile pro DS.
Von diesen Sätzen habe ich ein paar MB.

Ich will diese Daten danach durchsuchen, die Treffer rausziehen und neu formatiert in einer neuen Datei speichern.

Die erste der vier Zeilen unterscheidet einen DS signifikant von den anderen. Über diese erste Zeile wird hauptsächlich, aber nicht ausschließlich gesucht.

Danke mal für Deine Mühe

Bin morgen wieder da
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz