Seite 1 von 2

Einlesen von Zahlen aus Textdatei

Verfasst: 16.01.2005 17:46
von WeEf
Hallo,
ich bin gerade dabei, meine in VB.NET geschriebenen Programme in PureBasic umzuschreiben. Der folgende Codeteil läuft in VB.NET einwandfrei:
Do While Not EOF(1)
i = i + 1 ' Einlesen der Gewinnzahlen
Input(1, Spieltag(i))
Input(1, Spielmonat(i))
Input(1, Spieljahr(i))
For j = 1 To 6
Input(1, Systemzahl(j, i))
Next
Input(1, Zusatzzahl(i))
Loop
Meine bisherigen Versuche, die Daten wie oben einzulesen, ergaben nur fehlerhafte Werte. Die Zahlenwerte sind durch Leerzeichen getrennt in der entsprechenden Datei auf der Platte vorhanden. Da die Zahlen weiterverarbeitet werden müssen, soll nach dem Einlesen darauf zugegriffen werden.
Kann mir als Laie jemand eine brauchbare Lösung anbieten oder muss das zeilenweise eingelesen und erst dann verteilt werden.
Für eine kurze Hilfe schon heute Dank!

Verfasst: 16.01.2005 17:59
von nicolaus
schau ir mal den befehl ReadLong() in der hilfe an der solte dir helfen[/code]

Verfasst: 16.01.2005 18:39
von Kaeru Gaman
ich glaube, die ursprungsdatei enthält die werte als ASCII-Klartext,
nicht als 4byte-Longs.

routine schreiben zum byteweise einlesen und trennzeichen-interpretation, fällt mir spontan dazu ein.

Verfasst: 16.01.2005 20:23
von WeEf
"Kaeru Gaman"]ich glaube, die ursprungsdatei enthält die werte als ASCII-Klartext, nicht als 4byte-Longs.
Hallo Kaeru Gaman,
Du hast Recht, es sind ASCII-Zeichen, die mit Word oder dem Editor von MS gespeichert wurden. Der Vorschlag von Nicolaus bringt undefinierbar großen Zahlen.
routine schreiben zum byteweise einlesen und trennzeichen-interpretation, fällt mir spontan dazu ein.
Das ist für einen Anfänger natürlich nicht so einfach, kannst Du mir einen genaueren Tipp oder Codeschnippsel mitteilen. Mit Trennzeichen wurde
bisher nicht gearbeitet, sondern nur mit dem Leerzeichen zwischen den Daten. Wenn das bei bestehenden Dateien geändert werden müßte, wäre das schon ein riesiger Arbeitsaufwand.

Verfasst: 16.01.2005 20:56
von Kaeru Gaman
Hallo WF,

auch ein SPACE kann ein trennzeichen sein...

probier mal diese proc:

Code: Alles auswählen

Procedure.l GetAscNum()

    EODF.l = 0  ; selbstdefinierte Variablen,
    outp.l = 0  ; nur zur verdeutlichung vordefiniert,
    inp.b  = 0  ; namen sind beliebig

    Repeat
        inp = ReadByte()                ; nächstes byte aus datei holen
    Until inp >= 48 And inp <= 57      ;ist es eine ziffer?

    outp = (inp-48)                     ; dann beginnt die zahl

    Repeat                          ; schleife für komplettes datenfeld

        inp = ReadByte()                ; nächstes byte aus datei holen
        
        If inp >= 48 And inp <= 57   ; ist es eine ziffer ?
            outp * 10                   ; bisheriges eine stelle nach links schieben
            outp + (inp-48)             ; 1-er stelle addieren
        Else                         ; keine ziffer?
            EODF = 1                    ; als Feld-Trenner ansehen
        EndIf

    Until EODF = 1                  ; ende des datenfeldes erreicht

    ProcedureReturn(outp)

EndProcedure
hab ich mit nem mini-file getestet, erwartet immer genau ein byte, das keine ziffer ist, als trennzeichen.

die einbindung in deine schleife sieht dann so aus:

Code: Alles auswählen

While Eof(1) = 0
    i + 1
    Spieltag(i) = GetAscNum()
    Spielmonat(i) = GetAscNum()
    Spieljahr(i) = GetAscNum()
    For j=1 To 6
        Systemzahl(j,i) = GetAscNum()
    Next
    Zusatzzahl(i) = GetAscNum()
Wend    
das konnte ich natürlich nicht testen, da ich ja deine datei nicht habe.
bitte schreibe, wenn fehler auftreten.

PS: sollten zwischen den zahlen verschieden viele leerzeichen stehn, muss das ganze nochmal modifiziert werden...

[EDIT]
habe den code oben schon modifizert,
jetzt können beliebig viele beliebige zeichen zwischen den ziffern stehen.
jede ziffernfolge wird als dezimalzahl ausgelesen, alles andere wird ignoriert, dient nur zur trennung.

Code: Alles auswählen

23/5/1967 654  was hier steht, wird ignoriert!   7  6543, 662 --- 54
wird als ingesamt acht dezimalzahlen eingelesen: 23,5,1967,654,7,6543,662,54

Verfasst: 16.01.2005 22:34
von WeEf
Hallo Kaeru Gaman ,
das sieht sehr gut aus.
Ich glaube, dass ich damit klar komme, aber ich benötige noch etwas Zeit, um das umzusetzen und zu testen.
Ich melde mich in jedem Falle, sobald ich Genaueres weiß.
Vorab aber schonmal herzlichen Dank!
(Vielleicht wäre es für mich auch einfacher, wenn ich nicht mit einer anderen Programmiersprache vorbelastet wäre, wenn auch nur hobbymäßig.)
Eins kann ich aber nicht oft genug sagen, die von mir bereits realisierten PureBasic-Programme sind nur einen Bruchteil so groß, wie die mit VB und ganz erheblich schneller und es muß kein Framework installiert sein.
GRuß
WeEf (Wilfried)

Verfasst: 16.01.2005 22:44
von ts-soft
Vielleicht kannste es auch mit ReadString lesen, und mit StringField trennen

Code: Alles auswählen

Ergebnis$ = StringField(String$, Index, " ")
Index ist dann Dein Schleifenzähler. Hoffe ich habe das Problem richtig verstanden :)

Verfasst: 17.01.2005 18:50
von Kaeru Gaman
@ts-soft

wenn ich mich an die vorgeschichte recht entsinne,
(lottozahlen der letzten 20 jahre oder so)
ist die datei von WeEf irre lang und enthält keine zeilenschaltungen,
da könnte deine lösung leicht an ihre grenzen stossen,
obwohl sie grundsätzlich richtig und wahrscheinlich eleganter ist. :allright:

mir ging es darum, eine schnelle, praktikable lösung zu präsentieren,
die individuell zugeschnitten ist, und keine sinnvolle und stilistisch
hochwertige umsetzung von Input(1,Ziel) :wink:

@WeEf
evtl. wäre es grundsätzlich sinnvoll, einen 'Überträger' zu schreiben,
der deine bereits vorhandenen daten in eine echte, sinnvoll strukturierte
Datenbank schreibt.
Auf diese DB kannst du dann mit deinem zukünftigen programm zugreifen,
und die zukünftigen daten gleich darin speichern.
Das würde auch die erstellung von beliebigen nachfolgeversionen
und zusätzlichen modulen erleichtern.

Verfasst: 17.01.2005 20:12
von WeEf
WeEf hat geschrieben:Hallo Kaeru Gaman ,
das sieht sehr gut aus.
WeEf (Wilfried)
Hallo,
so, ich habe das jetzt umgesetzt und die Sache läuft SUPER!
Ich bin so begeistert, dass ich die anderen Vorschläge gar nicht mehr ausprobiert habe.
Die Daten kommen dann mit der Auswertung in ein ListIconGadget. Auch das funktioniert einwandfrei, wenn ich auch diese Zahlen eigentlich rechtsbündig haben möchte. Das habe ich noch nicht gefunden.
Ist es auch möglich, bei einer späteren Gewinnermittlung in diesem Gadget die Zellen farblich hervorzuheben, in denen die Treffer sind.
Ich denke mir das so, wenn Zahl x mit der gezogenen Zahl y gleich ist,
diesen Vergleich mache ich sowieso, das dann die Zelle, in die die Zahl geschrieben wird, mit einer Hintergrundfarbe kenntlich gemacht wird.

Verfasst: 17.01.2005 23:11
von bluejoke
>Ist es auch möglich, bei einer späteren Gewinnermittlung in diesem Gadget die Zellen farblich hervorzuheben, in denen die Treffer sind.

Bei einer ganzen Zeile gehts auf jeden Fall, du brauchst aber die MoreListIconGadget-Lib, dies auf Purearea.net gibt