Einlesen von Zahlen aus Textdatei

Für allgemeine Fragen zur Programmierung mit PureBasic.
WeEf
Beiträge: 36
Registriert: 14.12.2004 23:12
Wohnort: Remscheid
Kontaktdaten:

Einlesen von Zahlen aus Textdatei

Beitrag 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!
PureBasic 4.31
Windows 7

Gruß WeEf
Es ist noch kein Meister vom Himmel gefallen - vielleicht sind auch gar keine oben
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

schau ir mal den befehl ReadLong() in der hilfe an der solte dir helfen[/code]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
WeEf
Beiträge: 36
Registriert: 14.12.2004 23:12
Wohnort: Remscheid
Kontaktdaten:

Beitrag 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.
PureBasic 4.31
Windows 7

Gruß WeEf
Es ist noch kein Meister vom Himmel gefallen - vielleicht sind auch gar keine oben
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
WeEf
Beiträge: 36
Registriert: 14.12.2004 23:12
Wohnort: Remscheid
Kontaktdaten:

Beitrag 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)
PureBasic 4.31
Windows 7

Gruß WeEf
Es ist noch kein Meister vom Himmel gefallen - vielleicht sind auch gar keine oben
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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 :)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
WeEf
Beiträge: 36
Registriert: 14.12.2004 23:12
Wohnort: Remscheid
Kontaktdaten:

Beitrag 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.
PureBasic 4.31
Windows 7

Gruß WeEf
Es ist noch kein Meister vom Himmel gefallen - vielleicht sind auch gar keine oben
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Antworten