If Abfrage spinnt?

  • Hallo,

    folgende Eigenartigkeit erübrigt sich bei mir..

    [autoit]

    Msgbox(1,"Blub",$bestand[0])

    if $bestand[0] >= 1 Then
    blablablabla
    Endif

    [/autoit]

    Laut Msgbox beträgt der $Bestand[0] 971 - Also eig. müsste doch die "if Abfrage" anspringen?
    Aber sie wird einfach übersprungen..

    Lg
    Dustyn

  • Hallo,

    Du hast ein zwei sachen falsch gemacht, so siehts richtig aus:

    [autoit]

    Msgbox(1,"Blub",$bestand)

    if $bestand >= 1 Then
    "blablablabla"
    Endif

    [/autoit]


    Viel spaß noch beim scripten !

  • Hallo,
    wo ist das Problem?

    [autoit]

    dim $bestand[2]=[20,-5]

    [/autoit][autoit][/autoit][autoit]

    Msgbox(1,"Blub",$bestand[0])

    if $bestand[0] >= 1 Then
    msgbox(0,0,"Bestand ist größer/gleich 1, der Bestand ist: "&$bestand[0])
    Endif

    [/autoit]
  • Hallo,

    danke für die Antworten !

    Zu dem Beitrag von Professionalisc möchte ich sagen,
    dass ich wohl leider vergessen habe zu erwähnen,dass es sich bei
    der Variable tatsächlich um ein Array handelt !

    Zu Andy:

    Inwiefern weicht denn dieser Aufbau nun von meinem?
    Das Array $Bestand is in der ersten Dimension ( richtig so?) -
    also in [0] deklariert - sonst würde er mir ja bei der Kontrollfunktion
    von "Msgbox" nicht einen Wert ausspucken.

    DIe If Abfrage hast du doch genauso gestaltet wie ich, oder liege ich falsch?

    Lg,
    Dustyn

  • Hallo abc-user,
    das sahnige Geheimnis besteht darin, im "Fehlerfall" den Code mit Debug und/oder Trace-Anweisungen (Scite in den Tools) solange aufzufüllen, bis sich der "Fehler" bemerkbar macht. In deinem Fall ist es definitiv kein "Fehler" in der IF-Anweisung, sondern einer dieser typischen GRMBLFxx#%!-Haareraufgeschichten, z.B. Variable falsch geschrieben, oder vorher in irgendeiner Funktion den Wert geändert , oder String und Number verpennt uswusf.

    Bei "IF" ist die Suche immer einfach, denn wenn der Fall nicht eintrifft, fragt man mit "ELSE" die Alternative ab, Infos gibt es so IMMER!
    Ohne diese drecks Fehlersuche würde Programmieren wesentlich mehr Spass machen, aber der Vorteil ist, daß man Erfahrung gewinnt, solange man nicht Lernresistent ist! :thumbup:

    viel Spass beim Fehlersuchen
    Andy

  • Hallo,

    danke an alle für die Hilfestellungen !

    Den Versuch des Debuggens versuche ich im moment mithilfe von Ausgabeboxen
    á la MsgBox oder _arraydisplay.
    Das Problem mit dem verwechseln von Number und Strings habe ich, so denke ich, auch im moment^^
    So wirft die Funktion _stringbetween einen Array-Wert aus welcher als String wiederum gelesen werden soll.
    Was aber auch geht, wenn es sich dabei nur um ein ein Wort handelt.

    Aber wenn ich nun die beiden ursprunglichen Arrays, welche aus einer _stringbetween Funktion
    ausgeworfen worden sind, zusammenfügen will - Mache ich das wie folgt

    [autoit]

    $Bestand2 = _StringBetween($Source, $A_Abfrage_S[$i], $A_Abfrage_E[$i])
    Msgbox(1,"Abfrage",$Bestand2[0])
    $Bestand = $Bestand[0] & $Bestand2[0]

    [/autoit]

    Ist das so vom Prinzip her in Ordnung?
    Darf ich das überhaupt in diesem Thread mit anderer Ursprungsproblematik fragen?
    Ich hoffe,dass es in Ordnung geht

  • Hallo,
    lies dir mal das in Ruhe durch und versuche zu verstehen um was es eigentlich geht. Viele Probleme in Autoit haben genau damit zu tun!
    So einfach die "Deklaration" von Variablen ist (es gibt nur einen Datentyp! ) genauso schwer ist das auseinanderhalten der Typen, denn im Gegensatz zu anderen Programmiersprachen bringt AutoIt KEINE Fehlermeldung wenn du die verschiedenen Typen durcheinanderwürfelst.

    Zitat

    Das Problem mit dem verwechseln von Number und Strings habe ich, so denke ich, auch im moment

    So siehts aus^^
    Ein Bestand ist m.E. eine bestimmte Anzahl an Teilen in einem Lager, also würde ich diese Variable als Zahl (Number) sehen. Wenn du 2 Bestände hast und die Summe dieser Bestände suchst, dann würde ICH diese Bestände einfach addieren.

    [autoit]

    $bestand1=122 ;Zahl
    $bestand2=75 ;Zahl
    $gesamt=$bestand1 + $bestand2 ;"plus" addiert zwei Zahlen
    msgbox(0,0,$gesamt) ;in der msgbox erscheint 197

    [/autoit]


    Benutzt du aber das kaufmännische "und", dann werden die beiden "Zahlen" automatisch in Strings umgewandelt und aneinandergehängt

    [autoit]

    $bestand1=122 ;Zahl
    $bestand2=75 ;Zahl
    $gesamt=$bestand1 & $bestand2 ;mit "und" werden Strings aneinandergehängt
    ;$gesamt=12275 in AutoIt sowohl als String und auch als Zahl weiterzuverarbeiten
    msgbox(0,stringlen($gesamt),$gesamt)

    [/autoit]


    Wenn du absolut sicher gehen willst, um welchen Datentyp es sich handelt, dann nutze

    [autoit]

    IsArray, IsFloat, IsInt, IsNumber, IsBool, IsHWnd, IsBinary

    [/autoit]


    ciao
    Andy

  • Vielen dank für die ausführliche Antwort !

    Habe es mir zu Herzen genommen und durchgelesen.

    Scheinbar minder erfolgreich?

    Denn folgender Codeauschnitt kommt nicht auf das erwünschte Ergebnis

    $Test1 = 10
    $Test2= 288

    [autoit]

    $Bestand = ($Test1*1000)+$Test2

    [/autoit]

    Ergebit bei mir 10.000 als Ausgabe .. Auch ohne Klammer.. auch wenn ich versuche
    ein Array a la

    [autoit]

    $Bestandneu = $Bestand[0] + $Bestand2[0]

    [/autoit]

    Zu Berechnen wird dies nicht akzeptiert.. kein Error, einfach nur falsches Ergebnis !

    Oder liegt es einem falschen Datentyp?

    Die Werte kommen aus der Funktion _StringBetween
    In der Beschreibung steht :

    Zitat

    Funktion _StringBetweenErfolg: Ein 0-basierendes $Array[0] enthält den ersten gefundenen String.

    Was ist ein 0-basierendes Array?
    Ist das Rückergebnis nun ein String?
    Aber kann ein String welcher nur Zahlen beeinhaltet nicht als "Number"
    weiterbearbeitet werden?

    EDIT:

    Via der Abfrage "istring" habe ich festgestellt, dass es sicher leider bei beiden
    Variablen um Strings handelt - ich schätze,dass auch deswegen die Addition via "+" nicht geht..
    Gibt es eine Möglichkeit, diese Strings in Zahlen umzuwandeln? Oder einfach das kaufmännische UND benutzen?


    Lg,
    Dustyn

    2 Mal editiert, zuletzt von abc-user (14. Juli 2009 um 23:29)

  • Hi,

    AutoIt konvertiert manchmal die Daten automatisch, darauf würde ich mich aber nicht verlassen !

    Spoiler anzeigen
    [autoit]

    $Test1 = "10"
    $Test2 = 288

    [/autoit] [autoit][/autoit] [autoit]

    ; Funktioniert, ist aber nicht explizit
    ; und daher nicht zuverlässig
    $Bestand = ($Test1*1000)+$Test2

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite ("----------------------" & @crlf)
    ConsoleWrite ("+> Bestand = "&$Bestand & @crlf)
    ConsoleWrite ("----------------------" & @crlf)

    [/autoit] [autoit][/autoit] [autoit]

    Exit (0)

    [/autoit]


    Dieses Beispiel funktioniert zwar und gibt 10288 aus, aber wie gesagt, ich würde mich nicht darauf verlassen.

    Daher sollte man, wie Andy bereits erwähnte, die Variablen korrekt deklarieren und auch nur die entsprechenden Funktionen darauf anwenden.
    D.h. bei Zahlen keine String Funktionen anwenden und umgekehrt.
    Sollte dies jedoch nicht zu vermeiden sein - kann ja mal wirklich sein - , dann sollte man die Datentypen mit den entsprechenden Funktionen "casten".

    [autoit]

    $test = 100

    [/autoit][autoit][/autoit][autoit]

    If (IsInt ($test)) Then
    ConsoleWrite ("+> IsInt" & @crlf)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $test = StringReplace ($test, "1", "2")

    [/autoit][autoit][/autoit][autoit]

    If (Not IsInt ($test)) Then
    ConsoleWrite ("!> Not IsInt" & @crlf)
    $test = Int ($test)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If (IsInt ($test)) Then
    ConsoleWrite ("+> IsInt" & @crlf)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Exit (0)

    [/autoit]


    Gruß
    Greenhorn


  • Hallo,

    Zitat

    Habe es mir zu Herzen genommen und durchgelesen.

    braaaaav^^
    Wenn du (gutgemeinter Rat, nicht böse sein) auch von den "guten" AutoIt´lern hier eine Antwort haben möchtest, dann solltest du wenn möglich deinen kompletten Code posten.
    Zu deinen Beispielen:

    [autoit]

    $Test1 = 10
    $Test2= 288
    $Bestand = ($Test1*1000)+$Test2
    msgbox(0,0,$bestand)

    [/autoit]

    hier kommt IMMER das richtige Ergebnis raus!
    Allerdings kann keiner von uns erahnen, woher deine Variablen kommen. daher ist es wichtig, den Code soweit wie nötig vorzulegen.
    Wenn du selbst nicht weist, welchen Datentyp deine Variable hat, dann erzwinge doch einen Fehler und du weisst sofort Bescheid!

    Spoiler anzeigen
    [autoit]

    $Test1 = 10
    $Test2 = 288
    If IsNumber($Test1) And IsNumber($Test2) Then ;nur wenn beide eine Zahl sind
    $Bestand = ($Test1 * 1000) + $Test2 ;dann addieren
    MsgBox(0, 0, $Bestand)
    Else ;falls $test 1 oder $test2 keine zahlen sind..
    MsgBox(0, "FEHLER", " Es dürfen nur Zahlen addiert werden!")
    EndIf

    [/autoit]

    Setze einfach mal Anführungsstrichelchen vor und hinter die 10 und lasse das Script nochmal laufen....

    Zitat

    Oder liegt es einem falschen Datentyp?

    Ohne den Code gesehen zu haben, mit 99%iger Sicherheit JA^^

    Zitat

    Was ist ein 0-basierendes Array?


    Was ein Array ist weisst du? Ich erkläre das meist anhand von einer Tabellenkalkulation.
    Ein eindimensionales Array ist eine Spalte in der Tabelle, man kann die einzelnen Zellen mit A1, A2, A3 usw ansprechen
    Ein zweidimensionales Array ist ein Tabellenblatt, dort spricht man die einzelnen Zellen über ihre "Koordinaten" an, also Zeile und Spalte: A1, B7,K12
    Ein dreidimensionales Array hast du wenn Tabellenblätter T ins spiel kommen:T1A1,T3B4,T5K12 usw...

    In einer Tabelle findest du die Zellen über Zeilen und Spalten, MEISTENS fängt die Zählweise mit erste Spalte, erste Reihe an...logo, ist ja auch die erste Spalte bzw. Reihe!
    In einem NULLBASIERTEN Array ist der Index der ERSTEN Reihe/Spalte aber keine Eins, sondern eine Null!
    Wenn du nun ein Array dimensionierst, wird das noch besser^^. Die Funktion Ubound() ist dein Freund!
    Der Wert, der von UBound zurückgegeben wird, ist um 1 größer als der Index des letzten Elements im Array, da die Untergrenze einer Dimension immer 0 ist.

    [autoit]

    dim $a[3]=[1,2,3] ;die 1 hat den Index NULL, also $a[0]=1 !!!!

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,0,"Das Array hat "&ubound($a)&" Elemente")

    [/autoit][autoit][/autoit][autoit]

    for $index=0 to ubound($a)-1 ;ubound liefert 3 elemente, erste Zahl ist 1 mit dem Index null!!!
    msgbox(0,"Arrayelemente", $index+1 & ". Element= " & $a[$index]) ;beachte index+1 und $a[$i]
    next

    [/autoit]

    ciao
    Andy


    *edit*

    Zitat

    Gibt es eine Möglichkeit, diese Strings in Zahlen umzuwandeln?


    yepp,

    [autoit]

    $a = "12 " ;ein string, leerzeichen beachten!
    $b = Number($a) ;eine Zahl
    MsgBox(0, 0,"$a & $a = " & $a & $a & @CRLF & _ ;klar, 2 strings werden aneinandergehängt
    "$a * $a = " & $a * $a & @CRLF & _ ;mit strings kann man nicht rechnen, daher null*null=null
    "$b & $a = " & $b & $a & @CRLF & _ ;wieder 2 strings
    "$b + $a = " & $b + $a & @CRLF & _ ;12+0=12
    "$b + $b = " & $b + $b) ;12+12=24

    $a = "12" ;ein string!!!
    $b = Number($a) ;eine Zahl
    MsgBox(0, 0,"$a & $a = " & $a & $a & @CRLF & _ ;klar, 2 strings werden aneinandergehängt
    "$a * $a = " & $a * $a & @CRLF & _ ;Autoit macht aus dem string eine Zahl wenn möglich, um damit zu rechen!
    "$b & $a = " & $b & $a & @CRLF & _ ;wieder 2 strings
    "$b + $a = " & $b + $a & @CRLF & _ ;12+12=24
    "$b + $b = " & $b + $b) ;12+12=24

    [/autoit]
    Zitat

    Oder einfach das kaufmännische UND benutzen?


    6, setzen^^

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (15. Juli 2009 um 00:33)

  • Wiedereinmal danke für die ausführlichen Antworten!

    Werde mir diese gleich noch einmal durchlesen und versuchen nachzuvollziehen.

    Natürlich kann ich auch meinen Code hier reinstellen, beweifel nur, dass es weiterhilft..
    er ist nicht so richtig..übersichtlich, denke ich.

    Spoiler anzeigen
    [autoit]


    #include <FF.au3>
    #include <string.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    If _FFConnect() Then
    _FFTabSetSelected("Welt 43","label")
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    sleep(100)
    _FFFrameEnter("main","id") ; id später abfragen?

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Source = _FFReadHTML("html")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to 2

    [/autoit] [autoit][/autoit] [autoit]

    Msgbox(1,"I?",$i)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $A_Abfrage_E[3]
    Dim $A_Abfrage_S[3]
    Dim $A_HABZ2[3]
    Dim $A_HABZ1[3]
    Dim $A_HAB1[3]
    Dim $A_HAB2[3]
    Dim $A_HAB3[3]
    Dim $Bestandalt
    Dim $Bestand [3]
    Dim $Bestand2 [3]
    Dim $Tester

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $A_HAB1[1] = "Rohstoffe:</th><td><img src=""graphic/holz.png?1"" title=""Holz"" alt="""">"
    _ArrayInsert($A_HABZ1,$i, $Bestand[0]) ;!!!!!!!!!!!!!
    _ArrayInsert($A_HABZ2,$i, $Bestand2[0]) ;!!!!!!!!!!!!!!!!!!!!!!!
    $A_HAB3[1] = "<span class=""grey"">.</span>"
    $A_HAB2[2] = " <img src=""graphic/lehm.png?1"" title=""Lehm"" alt="""">"
    _ArrayInsert($A_HAB1,$i, $Bestand2[1])

    [/autoit] [autoit][/autoit] [autoit]

    $A_Abfrage_S[1] = "Rohstoffe:</th><td><img src=""graphic/holz.png?1"" title=""Holz"" alt="""">"
    $A_Abfrage_E[1] = "<"
    ;$A_Abfrage_S[2] = $A_HABZ2[$i]&$A_HAB2[$i] ;!!!!!!!!!!!!!!!!!
    $A_Abfrage_E[2] = "<span class=""grey"">.</span>"

    [/autoit] [autoit][/autoit] [autoit]

    $Bestand = _StringBetween($Source, $A_Abfrage_S[$i] , $A_Abfrage_E[$i])
    _arraydisplay($Bestand)

    [/autoit] [autoit][/autoit] [autoit]

    if $Bestand[0] >= 1 Then
    _ArrayInsert($A_HAB1,$i, $Bestand2[1])
    $A_Abfrage_S[$i] = $A_Hab1[$i]&$A_Hab2[$i]&$A_Hab3[$i]
    msgbox(1,"Gucken",$A_Abfrage_S[2])
    $Bestand2 = _StringBetween($Source, $A_Abfrage_S[$i], $A_Abfrage_E[$i])
    _ArrayDisplay($bestand2)
    $Bestandneu = $Bestand[0] & $Bestand2[$i]
    ;$Tester = IsInt ( $Bestandneu )
    ;Msgbox(2,"mhmmm",$Tester)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;$Tester = IsInt ( $Bestandneu )
    ;Msgbox(2,"mhmmm",$Tester)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(1,"Bestand",$Bestandneu)
    endif

    Next

    [/autoit]


    Bin ständig am rumfuchteln und ändern und neuschreiben.. ändert sich eig. von Minute zu Minute..
    Im moment funktioniert er eher weniger.. - Lässt sich allerdings schlecht nachvollziehen ohne
    den Quellcode von der Seite

  • Hi,
    zunächst würde ich den HTML-Code (der wichtige Ausschnitt) in den $source - String giessen! Dann sehen wir auch was Sache ist!
    Also Sourcecode kopieren, und in den Autoit-Quellcode einfügen

    [autoit]

    $source="HIERHINEINKOPIEREN"

    [/autoit]


    Innerhalb deiner For/To Schleife dimensionierst du immer wieder neu, dazu besteht keinerlei Grund!
    Ich ahne halbwegs was du vorhat, aber so ganz steige ich nicht durch. ^^
    Fasse das mal in Worte :thumbup:

    Andy

  • Hallo,

    danke für die Antwort !

    Durch ein bearbeiten des alten Posts, hätte man nicht gesehen, dass ich deiner "bitte" nachgegangen bin..
    daher hier mit dem wichtigen Sourceabschnitt

    Spoiler anzeigen

    include <FF.au3>
    #include <string.au3>
    #include <Array.au3>

    If _FFConnect() Then
    _FFTabSetSelected("Welt 43","label")
    Endif

    sleep(100)
    _FFFrameEnter("main","id") ; id später abfragen?


    $Source = "<tbody><tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">454 <img src="graphic/lehm.png?1" title="Lehm" alt="">1<span class="grey">.</span>646 <img src="graphic/eisen.png?1" title="Eisen" alt="">1<span class="grey">.</span>061 </td></tr>

    ; Am besten so einen geraden Strich darein machen.. weiß nur ned, wo der ist


    For $i = 1 to 2

    Msgbox(1,"I?",$i)

    Dim $A_Abfrage_E[3]
    Dim $A_Abfrage_S[3]
    Dim $A_HABZ2[3]
    Dim $A_HABZ1[3]
    Dim $A_HAB1[3]
    Dim $A_HAB2[3]
    Dim $A_HAB3[3]
    Dim $Bestandalt
    Dim $Bestand [3]
    Dim $Bestand2 [3]
    Dim $Tester


    $A_HAB1[1] = "Rohstoffe:</th><td><img src=""graphic/holz.png?1"" title=""Holz"" alt="""">"
    _ArrayInsert($A_HABZ1,$i, $Bestand[0]) ;!!!!!!!!!!!!!
    _ArrayInsert($A_HABZ2,$i, $Bestand2[0]) ;!!!!!!!!!!!!!!!!!!!!!!!
    $A_HAB3[1] = "<span class=""grey"">.</span>"
    $A_HAB2[2] = " <img src=""graphic/lehm.png?1"" title=""Lehm"" alt="""">"
    _ArrayInsert($A_HAB1,$i, $Bestand2[1])

    $A_Abfrage_S[1] = "Rohstoffe:</th><td><img src=""graphic/holz.png?1"" title=""Holz"" alt="""">"
    $A_Abfrage_E[1] = "<"
    ;$A_Abfrage_S[2] = $A_HABZ2[$i]&$A_HAB2[$i] ;!!!!!!!!!!!!!!!!!
    $A_Abfrage_E[2] = "<span class=""grey"">.</span>"

    $Bestand = _StringBetween($Source, $A_Abfrage_S[$i] , $A_Abfrage_E[$i])
    _arraydisplay($Bestand)

    if $Bestand[0] >= 1 Then
    _ArrayInsert($A_HAB1,$i, $Bestand2[1])
    $A_Abfrage_S[$i] = $A_Hab1[$i]&$A_Hab2[$i]&$A_Hab3[$i]
    msgbox(1,"Gucken",$A_Abfrage_S[2])
    $Bestand2 = _StringBetween($Source, $A_Abfrage_S[$i], $A_Abfrage_E[$i])
    _ArrayDisplay($bestand2)
    $Bestandneu = $Bestand[0] & $Bestand2[$i]


    MsgBox(1,"Bestand",$Bestandneu)
    endif

    Next

    Das Problem ist ein wenig schwieriger zu erörtern.. sind die Ressourcen weniger als 1000 lässt es sich leicht einlesen..
    undzwar vom "Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">" bis zur abschlienden "<"
    Wenn ich nun weiterlesen möchte, sprich dies hier einlesen will :

    <img src="graphic/lehm.png?1" title="Lehm" alt="">1<span class="grey">.</span>646 >

    Wird es kompliziert.. für mich zumindest.

    Wenn ich ab "<img src="graphic/lehm.png?1" title="Lehm" alt="">" lese, sucht er die falsche Zeile..
    Weil es sie schon einmal vorher gibt, mit dem selben Inhalt.. also muss ich an diese Zeile das Ergebnis
    des vorherigen Suchvorganges voranstellen.. also "646<img src="graphic/lehm.png?1" title="Lehm" alt="">"
    wäre der Suchbegriff.. na ja, und so weiter - Zumindest in der Theorie.

    Ich denke, dass ich auf dem Holzweg bin.. brauch ich eine "If-Abfrage" die Abfragt ob das Ergebnis größer als eins ist?
    Ich denke, dass das ungeschickt gelöst ist.. Bin aber auch ein totaler Anfänger und noch am lernen.. :)

    Falls jemand lust hat, sich das mal anzusehen, wäre ich ihm dankbar.
    Aber wenn möglich bitte nur Hilfestellungen geben, soll ja immer noch
    von mir (großteils) geschrieben sein ^^

    Lg,
    Dustyn

  • Hallo Dustyn,
    ich glaube ich habs begriffen :rolleyes:
    Ich versuche es mal zusammenzufassen:
    - Du suchst im Prinzip die Anzahl der Rohstoffe, diese Anzahl befindet sich innerhalb des html-Codes, allerdings mehrfach?
    - Es gibt mehrere Rohstoffe, Holz, Eisen, Lehm usw...
    - Die Anzahl der Rohstoffe stehen im Code "in der Nähe" der Rohstoffnamen "Holz", "Eisen" usw.

    Ich vermute mal, du siehst das VIEL zu kompliziert^^, obwohl dein Ansatz richtig ist!
    Ich würde es so machen:
    Die Anzahl(blauer String) ist doch immer zwischen dem roten und dem grünen Stringteil?!
    $html=<img src="graphic/lehm.png?1" title="Lehm" alt="">124<span class="grey">.</span>646 >
    1. Roten String suchen im htmlcode mittels stringinstr(). Du erhälst die Position im html-Code.
    2. Zu dieser Position zählst du die Länge des roten Strings ( stringlen() ) dazu. Deine Position ist nun genau VOR dem blauen String, nennen wir P1
    3. Alles links von dieser Position abschneiden mit stringtrimleft($html,$p1), übrig bleibt der String mit der Anzahl am Anfang
    $Anzahl_Holz=124<span class="grey">.</span>646 >
    3. mittels stringinstr() den grünen String im html-Code suchen(eigentlich ja nur das nächste <-Zeichen?! ), du bist jetzt also genau HINTER der Anzahl der Rohstoffe.(hinter dem blauen String), nennen wir P2
    4. Alle Zeichen bis zur Position P2 (egal wieviele) sind also die Anzahl der Rohstoffe. mit Stringleft($anzahl_holz,$p2) erhälst du diesen String
    $anzahl_Holz=124
    5. Da dein blauer String nur aus Zahlen besteht, kannst du auch damit rechnen......wenn nicht, ggf mit stringstripws() alle Leerzeichen entfernen

    ciao
    Andy

    Spoiler anzeigen
    [autoit]

    $Source = '"<tbody><tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">454 <img src="graphic/lehm.png?1" title="Lehm" alt="">1<span class="grey">.</span>646 <img src="graphic/eisen.png?1" title="Eisen" alt="">1<span class="grey">.</span>061 </td></tr>'

    [/autoit] [autoit][/autoit] [autoit]

    $s_holz='<tbody><tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">'
    $s_lehm='<img src="graphic/lehm.png?1" title="Lehm" alt="">'
    $s_eisen='<img src="graphic/eisen.png?1" title="Eisen" alt="">'

    [/autoit] [autoit][/autoit] [autoit]

    $Anzahl_holz=stringtrimleft($source,stringinstr($source,$s_holz) + stringlen($s_holz)-1) ;Alles links von der Anzahl abschneiden
    $p2=stringinstr($anzahl_Holz,"<")-1 ;Position genau vor dem <-Zeichen
    $anzahl_Holz=StringStripWS(stringleft($anzahl_Holz,$p2),8) ;alles abschneiden rechts von der Position $p2, alle leerzeichen entfernen

    [/autoit] [autoit][/autoit] [autoit]

    $Anzahl_lehm=stringtrimleft($source,stringinstr($source,$s_lehm) + stringlen($s_lehm)-1) ;Alles links von der Anzahl abschneiden
    $p2=stringinstr($anzahl_lehm,"<")-1 ;Position genau vor dem <-Zeichen
    $anzahl_lehm=StringStripWS(stringleft($anzahl_lehm,$p2),8) ;alles abschneiden rechts von der Position $p2, alle leerzeichen entfernen

    [/autoit] [autoit][/autoit] [autoit]

    $Anzahl_eisen=stringtrimleft($source,stringinstr($source,$s_eisen) + stringlen($s_eisen)-1) ;Alles links von der Anzahl abschneiden
    $anzahl_eisen=StringStripWS(stringleft($anzahl_eisen,stringinstr($anzahl_eisen,"<")-1),8) ;alles abschneiden rechts von der Position $p2, alle leerzeichen entfernen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    msgbox(0,"Rohstoffe","Anzahl Holz = "&$anzahl_holz&@crlf& _
    "Anzahl Lehm = "&$anzahl_lehm&@crlf& _
    "Anzahl Eisen = "&$anzahl_eisen)

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (15. Juli 2009 um 04:11)

  • Hallo,

    entschuldige, mein Fehler!

    Habe es versäumt, die genaue Problematik zu erklären.

    Spoiler anzeigen


    DIe Problematik besteht darin, dass wenn ein Rohstoffwert unter 1000 ist, er wie folgt dargestellt wird -
    title="Holz" alt="">454 <img - Im Browser sieht man nun "Holz 454"
    Wenn allerdings die erste Position der Zahlen, nicht die "hunderter" sonder die "tausender" sind,
    dann wird der Code wie folgt dargestellt -
    <img src="graphic/lehm.png?1" title="Lehm" alt="">124<span class="grey">.</span>646 >
    Jetz erscheint im Browser "Lehm 124.646"
    Würde ich nun versuchen, das Eisen auszulesen, könnte man vermuten ich müsste lediglich nach -
    <img src="graphic/eisen.png?1" title="Eisen" alt="">1<span class="grey">.</span>061 <
    Suchen, und wieder die Blauen Zahlen heraussuchen.
    Allerdings gibt es die Zeile mit dem folgenden Ausdruck -
    <img src="graphic/eisen.png?1" title="Eisen" alt=""
    Bereits schon vorher im Code und führt somit zu einem fehlerhaften Ergebnis !
    Um also die Zeile, in welcher er suchen soll, genauer definieren zu können, muss ich nach
    646 <img src="graphic/eisen.png?1" title="Eisen" alt="">1<span class="grey">.</span>061 < suchen -
    und hierbei wieder die beiden Ergebnisse zwischen dem roten rausschneiden und dann entweder die
    tausenderstelle "1" in diesem Fall, mit 1000 multiplizieren oder diese via kaufmännisches UND zusammenfügen.
    Denn 1000+061 = 1&061 - Wie du es mir bereits auch erklärt hast !

    Die "646" ist leider Variabel, daher muss ich beim definieren des Suchausdrucks für die Stringbetween Funktion
    die Suchvariable variabel gestalten. Dies habe ich durch Arrays versucht, da im 2. Suchdurchlauf $i = 2
    er nach Lehm suchen wird und um es zu finden das zuletzt gefundene Ergebnis benötigt.

    Dies bedeutet also, wenn er eine hunderterstelle gefunden hätte, soll diese vor den Suchausdruck
    <img src="graphic/eisen.png?1" title="Eisen" alt="">
    Findet er allerdings keine hunderstelle, weil es vorher nur "454" Holz war, soll er diese Stelle dort einfügen.

    Dafür habe ich folgende Idee

    Spoiler anzeigen
    [autoit]


    $A_3 = ' <span class="grey">.</span>'
    If $Ergebnis2 >= 1 Then ;
    $A_Suchen_S[2] = $Ergebnis2&$A_3 ; Wenn es hunderter gab, diese vorranstellen
    Elseif $Ergebnis1 >= 1 then
    $A_Suchen_S[2] = $Ergebnis2&$A_3 ; Wenn es keine gab, die erste Zahl ranstellen
    Endif

    [/autoit]

    Nun hätte er den Startstring definiert für den 2. Ablauf !

    Ich emfpinde das ganze als sehr umfrangreich, aber vllt. mache ich es mir doch zu kompliziert !

    Was spricht gegen meine _Stringbetween Idee? Ich finde sie eig. i.O.
    Am liebsten würde ich, da es im Tabellenform ist, einfach die Zelleninhalte auslesen via der FF.au3 Funktion _FFTableGetCell
    Allerding weiß ich nicht, wo welche Reihe und Zeile ist.. daher fällt das flach. Habe es versucht abzuzählen, aber ich bekomms ned hin.
    Muss daher so versuchen zu lösen.


    Das heisst ich muss beide oder auch nur eine blaue Zahl/en aus dem Code lesen.

    Wenn ich es versuche vereinfacht darzustellen,
    würde ich es wie folgt machen !

    Spoiler anzeigen
    [autoit]

    Quelle = Daten einlesen

    [/autoit] [autoit][/autoit] [autoit]

    $A_Suchen_S[1] = '<tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">'
    $A_Suchen_EL[1] = '<span class="grey">.</span>'
    $A_Suchen_EL[2] = '<span class="grey">.</span>'
    $A_Suchen_EK = ' <'

    [/autoit] [autoit][/autoit] [autoit]

    If $Ergebnis2 >= 1 Then ;
    $A_Suchen_S[1] = $Ergebnis2&$A_3
    Elseif $Ergebnis1 >= 1 then
    $A_Suchen_S[1] = $Ergebnis2&$A_3 ;
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    If $Ergebnis2 >= 1 Then ;
    $A_Suchen_S[2] = $Ergebnis2&$A_3
    Elseif $Ergebnis1 >= 1 then
    $A_Suchen_S[2] = $Ergebnis2&$A_3 ;
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    $Ergebnis1 = _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EK) ;Raussuchen der 1. Stelle nach Kriterium <1k
    ; Denn wenn die Zahl kleiner als 1000 dann endet es mit einem " <" - ist dies nicht der Fall, mit einem <span class.."
    ;Überprüfung ob das Ergebnis in eine INT umwandelbar ist - Wenn ja, besteht der String nur aus Zahlen - Lesen war erfolgreich
    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    If NOT@Error then ; String ist tatsächlich eine Zahl !
    Zahl speichern
    Else
    ; Überprüfen ob es sich um eine Zahl handelt, die größer als 1000 ist, und daher mit einem "<span" endet.
    ; Eine Zahl die kleiner als 1000 ist, würde man mit einem " <" überprüfen - Das Leerzeichen ist wichtig
    $Ergebnis1= _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EL[$i]) ; Raussuchen der 1. Stelle nach Kriterium >1k
    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    $Ergebnis2 = _StringBetween($Source, $A_Suchen_S2[$i],$A_Suchen_EK) ;Raussuchen der 2. Stelle nach Kriterium >1k
    ; Das Raussuchen der 2. Stelle ist ein wenig schwieriger, wie oben erklärt - Denn nun muss er die zuletzt gefundene Zahl an das
    ;zu Suchende Ergebnis vorranstellen.. dazu dient die oben erstellte "If" Abfrage
    ;Problem $A_Suchen_S2[1] is noch nicht definiert worden, da die definierung am Start des Programm erfolgt..aber
    ;das einbauen der Abfrage hierzwischen finde ich echt unschön.. kann man die Abfrage als Funktion gestalten und diese hier abrufen?
    ;Oder muss ich sie hier einbauen, da ich ja erst nun den $Ergebnis1 Betrag weiss.. hoffe, war verständlich ^^
    $Ergebnis2 = Int ($Ergebnis2[0]) ; Umwandeln des Strings in INT

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Ergebnis2 = Int ($Ergebnis2[0]) ; Umwandeln des Strings in INT
    $Ergebnis = ($Ergebnis1*1000) + $Ergebnis2

    [/autoit]

    So vom Prinzip her ! Habe gestern noch bis 3:00 dran gesessen, aber ich war wohl zu müde..
    Ich kann ja mal meinen aktuellen Stand posten, aber er ist leider falsch ! Habe die If-Abfrage
    nicht richtig definiert.. dies werde ich heute nochmal komplett überarbeiten.. ich bin dem ganzen dicht auf der Spur^^

    lg,
    Dustyn

    PS- Vielen dank für die ausfühliche Antwort !

    Aktuellercode -

    Spoiler anzeigen
    [autoit]


    #include <FF.au3>
    #include <string.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Source = '<tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">4<span class="grey">.</span>855 <img src="graphic/lehm.png?1" title="Lehm" alt="">2<span class="grey">.</span>221 <img src="graphic/eisen.png?1" title="Eisen" alt="">3<span class="grey">.</span>586 </td></tr>'
    ; >1<span class="grey">.</span>061 </td></tr>

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to 2

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(1,"$i Abfrage",$i)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $Ergebnis1
    Dim $Ergebnis2
    Dim $A_Suchen_S [3]
    Dim $A_Suchen_EL [3]
    Dim $A_Suchen_S2[3]
    Dim $A_Suchen_S3[3]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $A_Suchen_S[1] = '<tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">'
    $A_Suchen_EL[1] = '<span class="grey">.</span>'
    $A_Suchen_EL[2] = '<span class="grey">.</span>'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $A_Suchen_EK = ' <'
    $A_2 = ' <img src="graphic/lehm.png?1" title="Lehm" alt="">'
    $A_3 = ' <span class="grey">.</span>'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $A_Suchen_S2[1] = $Ergebnis1&$A_3
    $A_Suchen_S3[2] = $Ergebnis2&$A_2

    [/autoit] [autoit][/autoit] [autoit]

    If $Ergebnis2 >= 1 Then ;
    $A_Suchen_S[2] = $Ergebnis2&$A_3
    Elseif $Ergebnis1 >= 1 then
    $A_Suchen_S[2] = $Ergebnis2&$A_3 ;
    Endif

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Ergebnis1= _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EK) ;Raussuchen der 1. Stelle nach Kriterium <1k
    ;Msgbox(1,"test1",$)
    If $Ergebnis1 >= 1 then ; Zahl is <1k

    [/autoit] [autoit][/autoit] [autoit]

    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    If $Ergebnis1 = 0 then ; Wenn kein Ergebnis gefunden...
    $Ergebnis1= _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EL[$i]) ; Raussuchen der 1. Stelle nach Kriterium >1k
    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    $Ergebnis2 = _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EK) ;Raussuchen der 2. Stelle nach Kriterium >1k
    $Ergebnis2 = Int ($Ergebnis2[0]) ; Umwandeln des Strings in INT
    MsgBox(2,"..","oki")
    Elseif $Ergebnis1 >= 1 then ;!geht soweit mit Holz!
    $Ergebnis1= _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EL[$i])
    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    $Ergebnis2 = _StringBetween($Source, $A_Suchen_S2[$i],$A_Suchen_EK) ;
    $Ergebnis2 = Int ($Ergebnis2[0])
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    Else ; Zahl ist >1k
    $Ergebnis1= _StringBetween($Source, $A_Suchen_S3[$i],$A_Suchen_EL[$i]) ; Raussuchen der 1. Stelle nach Kriterium >1k
    MsgBox(1,"testö",$A_Suchen_S[$i])
    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    $Ergebnis2 = _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EK) ;Raussuchen der 2. Stelle nach Kriterium >1k
    ;Problem $A_Suchen_S[1] is noch nicht definiert worden, da die definierung am Start des Programm erfolgt..aber
    das einbauen der Abfrage hierzwischen finde ich echt unschön.. kann man die Abfrage als Funktion gestalten und diese hier abrufen?
    Oder muss ich sie hier einbauen, da ich ja erst nun den $Ergebnis1 Betrag weiss.. hoffe, war verständlich ^^
    $Ergebnis2 = Int ($Ergebnis2[0]) ; Umwandeln des Strings in INT
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    $Ergebnis = ($Ergebnis1*1000) + $Ergebnis2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Msgbox(1,"Ergebnis",$Ergebnis)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit]

    3 Mal editiert, zuletzt von abc-user (15. Juli 2009 um 13:17)

  • Hi, jetzt hab ichs begriffen^^
    Habe leider erst heute abend wieder zeit, bis denne
    Andy

  • Juhu !

    Es scheint nun endlich zu funktionieren !
    Zumindest liest er beide $Source Quellen fehlerfrei aus..
    Also kann er sowohl <1k also >1k nun auslesen.. ich denke, es ist vollbracht!

    Vielen dank an alle, die mir geholfen haben - Insbesondere an Andy, für die ausführlichen Erklärungen ! Danke :)

    Wenn jemand möchte, kann er gerne den Code kritisieren.. es müssen sich ja keine
    stillistischen Fehler einschleichen.. nur weil er funktioniert, muss er ja nicht effektiv/gut geschrieben sein^^

    Ich freue mich auf Feedback und Verbesserungsvorschläge,

    Dustyn

    Code

    Spoiler anzeigen
    [autoit]


    #include <FF.au3>
    #include <string.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Source = '<tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">453 <img src="graphic/lehm.png?1" title="Lehm" alt="">321 <img src="graphic/eisen.png?1" title="Eisen" alt="">0 </td>'
    ; >1<span class="grey">.</span>061 </td></tr>
    $Source2 = '<tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">6<span class="grey">.</span>106 <img src="graphic/lehm.png?1" title="Lehm" alt="">4<span class="grey">.</span>057 <img src="graphic/eisen.png?1" title="Eisen" alt="">3<span class="grey">.</span>058 </td></tr>'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to 3

    [/autoit] [autoit][/autoit] [autoit]

    ;------------------------;
    ;Deklarieren der Variablen
    ;------------------------;
    Dim $Ergebnis1
    Dim $Ergebnis2
    Dim $A_Suchen_S [4]
    Dim $A_Suchen_EL [3]
    Dim $A_Suchen_S2[4]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $A_Suchen_S[1] = '<tr><th>Erspähte Rohstoffe:</th><td><img src="graphic/holz.png?1" title="Holz" alt="">'
    $A_Suchen_EL[1] = '<span class="grey">.</span>'
    $A_Suchen_EL[2] = '<span class="grey">.</span>'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $A_Suchen_EK = ' <'
    $A_2 = ' <img src="graphic/lehm.png?1" title="Lehm" alt="">'
    $A_3 = '<span class="grey">.</span>'
    $A_4 = ' <img src="graphic/eisen.png?1" title="Eisen" alt="">'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $Ergebnis2 >= 1 Then ;
    $A_Suchen_S[2] = $Ergebnis2&$A_2
    Elseif $Ergebnis1 >= 1 then
    $A_Suchen_S[2] = $Ergebnis1&$A_2 ;
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    If $Ergebnis2 >= 1 Then
    $A_Suchen_S[3] = $Ergebnis2&$A_4
    Else
    $A_Suchen_S[3] = $Ergebnis1&$A_4
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------;
    ;ENDE des Deklarierens der Variablen
    ;----------------------------------;

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Ergebnis1 = _StringBetween($Source, $A_Suchen_S[$i],$A_Suchen_EK) ;Raussuchen der 1. Stelle nach Kriterium >1k
    If (IsArray ($Ergebnis1)) Then ;Wenn ein Ergebnis gefunden wurde - Unwandeln
    $Ergebnis1 = Int ($Ergebnis1[0]) ; Umwandeln des Strings in INT
    EndIf
    $A_Suchen_S2[$i] = $Ergebnis1&$A_3 ; Blöd an diese Stelle. - Er muss wohl hierhin?


    $Ergebnis2 = _StringBetween($Source, $A_Suchen_S2[$i],$A_Suchen_EK)
    If (IsArray ($Ergebnis2)) Then
    $Ergebnis2 = Int ($Ergebnis2[0]) ; Umwandeln des Strings in INT
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------;
    ;Bearbeitung der $Ergebnis Variablen
    ;----------------------------------;

    [/autoit] [autoit][/autoit] [autoit]

    If IsInt($Ergebnis1) And IsInt($Ergebnis2) Then ;nur wenn beide Int sind

    If $Ergebnis2 >= 1 then
    $Bestand = ($Ergebnis1*1000) + $Ergebnis2 ;dann addieren und multiplizieren wenn $Ergebnis2 vorhanden ist
    Else
    $Bestand = $Ergebnis1
    Endif
    Else
    MsgBox(1,"Fehler?","Da lief wohl etwas falsch :(")
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    ;--------------------------------------------;
    ;ENDE der Bearbeitung der $Ergebnis Variablen
    ;--------------------------------------------;

    [/autoit] [autoit][/autoit] [autoit]

    Msgbox(1,"Ergebnis",$Bestand)


    Next

    [/autoit]


    [EDIT]

    Im Ernstfall fällt es natürlich flach. Keine Ahnung warum er den Code wenn er ihn von der Seite zieht jetzt nicht mehr richtig liest..
    Liest nur den ersten Wert richtig aus, den Rest gibt er mit 0 wieder - grummel.

    Einmal editiert, zuletzt von abc-user (15. Juli 2009 um 22:24)