Von-Bis-Funktion im Game Maker

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Von-Bis-Funktion im Game Maker

    Hallo,

    ich arbeite zurzeit in einem Betrieb, welcher mit VersoOnline, Prisma und SQL Management 2010 arbeitet.
    Nun möchte ich den Arbeitsaufwand durch effektive Programme verringern, um die Effizienz zu erhöhen, aber stehe grad auf den Schlauch.

    Ich möchte 2 Textdokumente vergleichen und der Wert, der beim 1. vorhanden ist, beim 2. aber nicht, den möchte ich in einem 3. übertragen.

    Beispiel
    Dokument 1:
    a
    b
    c

    Dokument 2:
    a
    c

    Jetzt soll er zuerst a mit a und ac vergleichen, danach b mit a und c und zu guter letzt c mit a und c. Hier würde er dann logischerweise das "b" herausfiltern und in den 3. Dokument übertragen. Das habe ich jedoch nur teilweise hinbekommen, da ich einen Denkfehler drin hatte. Mein Problem ist nämlich, dass ja nicht nur b ungleich mit a und c ist, sondern auch a mit c und c mit a, wodurch er dann ebenso a und c in das 3. Dokument überträgt.

    Hier wäre eine von-bis-Funktion sehr hilfreich, da ich mit Arrays arbeite - und nebenbei angemerkt kenne ich mich mit Arrays weniger gut aus.
    Mit der von-bis-Funktion könnte ich dann b mit a bis c sozusagen vergleichen und wenn von b von a bis c nicht vorhanden ist, wird b gefiltert, damit würde er schließlich auch nichtmehr a und c übertragen.

    Beim Schreiben klingt das alles für mich selber kompliziert, aber ich hoffe ihr versteht was ich meine.

    Ich freue mich auf eure Hilfe und verbleibe

    mit freundlichem Gruß :)
  • die Idee mit dem von bis vestehe ich nicht, aber ich versuche dir mal das ohne zu testen zu coden:

    GML-Quellcode

    1. fileA=file_text_open_read("DokumentA.txt")
    2. fileB=file_text_open_read("DokumentB.txt")
    3. fileC=file_text_open_write("DokumentC.txt")
    4. for (zeilenA=0;file_text_eof(fileA);zeilenA+=1)
    5. file_text_readln(fileA)
    6. for (zeilenB=0;file_text_eof(fileB);zeilenB+=1)
    7. file_text_readln(fileB)
    8. file_text_close(fileA)
    9. file_text_close(fileB)
    10. fileA=file_text_open_read("DokumentA.txt")
    11. fileB=file_text_open_read("DokumentB.txt")
    12. while (1=1)
    13. {
    14. if file_text_eof(fileA)
    15. and !file_text_eof(fileB)
    16. while (!file_text_eof(fileB))
    17. {
    18. file_text_write_string(fileC,file_text_read_string(fileB))
    19. file_text_writeln(fileC)
    20. file_text_readln(fileB)
    21. }
    22. else
    23. if file_text_eof(fileB)
    24. and !file_text_eof(fileA)
    25. while (!file_text_eof(fileA))
    26. {
    27. file_text_write_string(fileC,file_text_read_string(fileA))
    28. file_text_writeln(fileC)
    29. file_text_readln(fileB)
    30. }
    31. else
    32. if file_text_eof(fileB)
    33. and file_text_eof(fileA)
    34. break
    35. if file_text_read_string(fileA)!=file_text_read_string(fileA)
    36. {
    37. if zeileA>zeileB
    38. file_text_write_string(fileC,file_text_read_string(fileB))
    39. else
    40. file_text_write_string(fileC,file_text_read_string(fileA))
    41. file_text_writeln(fileC)
    42. }
    43. file_text_readln(fileA)
    44. file_text_readln(fileB)
    45. }
    46. file_text_close(fileA)
    47. file_text_close(fileB)
    48. file_text_close(fileC)
    Alles anzeigen


    wie gesagt ist nicht getestet aber dürfte so gehen hoffe ich :D
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von husi012 ()

  • Öhm, nur mal so: warum machst du sowas im Game Maker? Der ist nicht wirklich dafür gedacht, solche Dateioperationen auszuführen - für solche Jobs gibt's Sprachen wie Perl (wenn du's extrem effizient brauchst) oder Python (wenn du's extrem schlicht brauchst). Beide Varianten sind in dieser Sache um Längen flexibler und schneller als der GM.

    Was husis Code angeht, kann ich jetzt nicht viel dazu sagen, weil ich den nur kurz überflogen hab. Aber, naja... hä? Du machst da ein paar ziemlich seltsame Sachen, die nach mehr Umstand aussehen, als eigentlich nötig ist.

    Ich hab mich jedenfalls mal kurz drangesetzt und das Programm in Python 2.7 geschrieben. Das Ergebnis ist folgendes:

    Quellcode

    1. # filename: "fdiff.py"
    2. def main():
    3. fA=open("fileA",'r')
    4. fB=open("fileB",'r')
    5. fC=open("fileC",'w')
    6. fAtemp=[]
    7. fBtemp=[]
    8. values=[]
    9. for line in fA:
    10. fAtemp.append(line.strip()) # remove whitespaces from string
    11. fA.close()
    12. for line in fB:
    13. fBtemp.append(line.strip()) # remove whitespaces from string
    14. fB.close()
    15. for Aval in fAtemp:
    16. if Aval not in fBtemp and Aval not in values:
    17. values.append(Aval)
    18. for Bval in fBtemp:
    19. if Bval not in fAtemp and Bval not in values:
    20. values.append(Bval)
    21. for val in values:
    22. fC.write(val)
    23. fC.write('\n')
    24. fC.close()
    Alles anzeigen


    Ersetz die Pfade in den open-Funktionen durch die tatsächlichen Pfade bei dir und schwupp, schon hast du's. Und ich bin mir ziemlich sicher, sogar diese paar Zeilen sind schon mehr, als eigentlich nötig ist, das geht unter Garantie auch in noch weniger Schritten. Wie also schon angemerkt: Für solche Operationen brauchst du keinen Gamemaker. ;)
  • Moin erstmal wieder.
    Der eine Code hat leider nicht so ganz geklappt, aber vielleicht habe ich mich einfach nur blöd ausgedrückt :D

    Ich habe mir jetzt mal Python 2.7.7 runtergeladen und werde den Code testen. Da ich mich nicht damit auskenne, werde ich aber wohl vorerst ein bischen schauen wo was ist :)

    Danke nochmal und vielleicht bis später.
  • Njo, ich hätte vielleicht schon mal erklären sollen, was ich da eigentlich mache, sorry. Da hab ich wohl zu viel als selbstverständlich angenommen. Passiert mir öfter mal. ^^

    Also, die Idee hinter Python ist im Grunde, dass man eine Turing-vollständige Sprache hat (d.h. eine, mit der man alles machen kann, was ein Computer machen kann), aber den Code so lesbar wie möglich hält. Deswegen begrenzt man die Programmabschnitte z.B. nicht mit geschweiften Klammern, sondern über die Texteinrückung, und deswegen werden auch Operatoren wie && und || nicht unterstützt, sondern man muss explizit "and" und "or" schreiben.
    Datentypen muss man auch nicht angeben - weil Python eine interpretierte Sprache ist, wie GML, kann der Interpreter die Typen von Variablen nach Bedarf festlegen. Wenn du sagst "a=42", dann sagt der Interpreter "Aha, 42 sagt er? Dann will er bestimmt, dass dieses Ding vom Typ int ist, dass da also nur ganze Zahlen drin sind". Wenn du dann später aber sagst: "a=42.00001", dann sagt er "Oops, okay, wohl doch nicht. Da dürfen wohl auch Kommazahlen rein. *bastel, schraub, änder, weitermach*".
    Anders als beim GM, der für jede Zahl annimmt, sie wäre vom Typ double, sucht sich Python automatisch das passendste, wann immer du mit einer Variable irgendwas machst, wofür ihr aktueller Typ nicht optimal ist.

    Was mache ich also in diesem Code?

    Quellcode

    1. fA=open("fileA",'r')
    2. fB=open("fileB",'r')
    3. fC=open("fileC",'w')
    4. fAtemp=[]
    5. fBtemp=[]
    6. values=[]

    "open" ist eine von Python vorgegebene Funktion, mit der man eine Datei öffnen kann. Einziges benötigtes Argument ist der Dateiname, das zweite Argument gibt den Modus an, in dem man auf dieser Datei arbeiten will. r für read und w für write. Die Variablen fA, fB und fC sind danach also vom Typ "Datei-Objekt".
    Die drei Variablen danach initialisiere ich mit der leeren Liste [] - das ist das selbe, als wenn ich im GM schreiben würde "values = ds_list_create();". Denk dir diese Listen als eine mächtigere Variante von Arrays.

    Quellcode

    1. for line in fA:
    2. fAtemp.append(line.strip()) # remove whitespaces from string
    3. fA.close()

    Das ist das erste Beispiel von Pythons einfacher Syntax. "for line in fA" lässt sich einfach lesen als "for each element 'line' in list 'fA". line ist eine neue Variable, die nur in dieser for-Schleife gültig ist und die nacheinander alle Elemente von meinem Dateiobjekt fA durchgeht - und das sind eben die Zeilen, die in dieser Datei gespeichert sind, drum hab ich sie auch "line" genannt. Mit <string>.strip() werden alle Zeichen wie "Neue Zeile" oder "Leerzeichen" vom Anfang und Ende des Strings entfernt, weil sonst "bla" und "bla " als unterschiedliche Strings behandelt würden. Die so "aufgeräumten" Strings werden dann in die Liste fAtemp gepackt und dann wird die Datei A wieder geschlossen, weil mit ihr nichts mehr weiter zu tun ist.

    Danach kommt das selbe nochmal mit der Datei B.

    Quellcode

    1. for Aval in fAtemp:
    2. if Aval not in fBtemp and Aval not in values:
    3. values.append(Aval)

    Das hier sind dann wohl die aussagekräftigsten Beispiele für die Einfachheit von Python. Diese if-Bedingung da erklärt sich quasi von selbst: Alle Strings in der Liste fAtemp (wo die Zeilen aus Datei A liegen), werden nacheinander darauf überprüft, ob sie auch in Datei B waren und ob sie schon in der Ergebnisliste liegen. Nur, wenn beides nicht zutrifft, kommen sie in die Ergebnisliste. Mit anderen Worten, es landen nur die Einträge aus Datei A in den Ergebnissen, die nicht in B sind - und wenn ein Eintrag doppelt vorkommt, kommt er trotzdem nur einmal ins Ergebnis.
    Das selbe dann nochmal mit der Liste für Datei B und schon hast du aus beiden Dateien nur die Zeilen gefiltert, die nicht in beiden dieser Dateien vorkamen.

    Anschließend werden die Ergebnisse des Filters noch in Datei C geschrieben (mit dem Neue-Zeile-Zeichen \n nach jedem dieser Ergebnisse) und fertig ist das Ganze.

    Mein Test sah so aus:

    Datei fileA:

    Quellcode

    1. a
    2. a
    3. b
    4. c
    5. d
    6. FUH


    Datei fileB:

    Quellcode

    1. a
    2. B
    3. c
    4. foo
    5. f o o
    6. FUH


    Output-Datei fileC:

    Quellcode

    1. b
    2. d
    3. B
    4. foo
    5. f o o


    Du siehst, es landen nur die Sachen in fileC, die sich in A oder B wiederfinden, aber nicht in beiden gleichzeitig. XOR auf Dateiebene quasi. ^^
    Ich hoff, das war jetzt nicht zu lang und umständlich erklärt - grad bei Python sind umständliche Erklärungen meistens ein Zeichen dafür, dass man beim Erklären was falch macht. :D
  • haha wie cool du das beschrieben hast, jetzt weiß ich endlich wie gm mit variablen umgeht XD

    Datentypen muss man auch nicht angeben - weil Python eine interpretierte Sprache ist, wie GML, kann der Interpreter die Typen von Variablen nach Bedarf festlegen. Wenn du sagst "a=42", dann sagt der Interpreter "Aha, 42 sagt er? Dann will er bestimmt, dass dieses Ding vom Typ int ist, dass da also nur ganze Zahlen drin sind". Wenn du dann später aber sagst: "a=42.00001", dann sagt er "Oops, okay, wohl doch nicht. Da dürfen wohl auch Kommazahlen rein. *bastel, schraub, änder, weitermach*".
    Anders als beim GM, der für jede Zahl annimmt, sie wäre vom Typ double, sucht sich Python automatisch das passendste, wann immer du mit einer Variable irgendwas machst, wofür ihr aktueller Typ nicht optimal ist.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Dankeschön für die ausführliche Erklärung erstmal :)
    Ich bin leider noch nicht dazu gekommen es zu testen, aber Python ist schonmal installiert.

    Ich hab dir mal für deine Mühe die hilfreichste Antwort erteilt, du hast es super erklärt :D

    Natürlich auch ein Dank an alle anderen die geholfen haben.