Variable bis zu einem bestimmten Zeichen auslesen

  • Hi,

    ich bins wieder ^^

    gibt es eine möglichkeit eine variable bis zum sagen wir 3. "_" auszulesen?

    z.b.:

    $var1 = "blubb test_123 asdf_123"

    ich möchte jetzt alles bis zum 2. "_" haben, also "blubb test_123 asdf".

    finde in der hilfe leider nix, ist für anfänger ziemlich schwierig, da was zu finden ;(

    Danke für eure hilfe!!!

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

    Einmal editiert, zuletzt von x0r (20. Oktober 2010 um 10:37)

  • Meinst das so?

    [autoit]

    $var1 = "blubb test_123 asdf_123"
    $array = StringSplit($var1, "_",2)
    MsgBox(0,"",$array[0] & "_" & $array[1])

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ja sowas ähnliches..

    ich mach nebenbei (naja mehr hauptsächlich) noch mIRC Scripting (https://autoit.de/www.mirc.com (irc chat client)) und da gibts einen befehl, der nennt sich "$gettok()".

    damit kann man z.b.:

    var %i = blubb asdf test usw
    return $gettok(%i,3,32)

    == blubb asdf test
    -
    (erste zahl ist die stelle, zweite zahl ist der ascii-wert für das gesuchte zeichen)

    alles bis zum 3. leerzeichen ausgeben.

    dachte, vielleicht gibts sowas auch für autoit :)

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Ja hat Chip dir aber schon genannt. (StringSplit).
    Du erhältst damit ein Array mit den Teilstrings:

    [autoit]

    #include <Array.au3>

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

    $String = "var %i = blubb asdf test usw"
    $aTokens = StringSplit($String, " ", 2)

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

    _ArrayDisplay($aTokens)

    [/autoit]
  • In diesem Fall würde ich aber eher eine Kombination aus Stringleft und Strininstr verwenden.
    Array's sind zwar schön und gut aber wenn er nun alles bis zum 3ten " " ausgeben möchte muss er aus dem Array wieder einen String basteln.

    Also wenns nur zum "Abschneiden" ist empfehl ich das:

    [autoit]

    $String = "var %i = blubb asdf test usw"
    $sTokens = StringLeft($String, StringInStr($String, " ", 0, 3)-1)
    Msgbox(0,"",$sTokens)

    [/autoit]
  • habs nun wie folgt gelöst, die variante mit den arrays von "chip" ist gar nicht so verkehrt :)

    Spoiler anzeigen
    [autoit]

    func copypaste()
    dim $i = 0
    Local $array[200]

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

    MouseClick("left",325,485)
    sleep(200)

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

    while $balken = 0 and $balken2 = 0 and $balken3 = 0

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

    if $balken4 = 1 and $i = 5 Then
    ExitLoop
    EndIf

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

    send("^c")
    sleep(300)
    $array[$i] = StringRegExpReplace(ClipGet(),' ','_')
    sleep(100)
    send("{down}")
    sleep(100)

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

    $i = $i +1

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

    $balken = _ImageSearch("pics\service_ende.bmp",1,$r1,$r2,2)
    $balken2 = _ImageSearch("pics\service_ende_2.bmp",1,$r1,$r2,2)
    $balken3 = _ImageSearch("pics\service_balken.bmp",1,$r1,$r2,2)
    $balken4 = _ImageSearch("pics\service_balken2.bmp",1,$r1,$r2,2)

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

    WEnd

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

    sleep(1000)
    winactivate("Tabelle1")
    sleep(200)

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

    AutoItSetOption("SendKeyDelay",0)

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

    dim $i = 0

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

    For $i = 0 to 200

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

    $var1 = $array[$i]
    $array2 = StringSplit($var1, "_",2)

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

    send("{down}")
    send("{home}")
    sleep(100)
    send($maschine)
    sleep(100)
    send("{right}")
    send("Service - Support - APOS")
    send("{right}")
    sleep(100)
    send($array2[0])

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

    send("{right}")
    sleep(100)
    send($array2[1])

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

    send("{right}")
    sleep(100)
    send($array2[2])

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

    send("{right}")
    sleep(100)
    send($array2[3])

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

    send("{right}")
    sleep(100)
    send($array2[4])

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

    send("{right}")
    sleep(100)
    send($array2[5])

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

    send("{right}")
    sleep(100)
    send($array2[6])

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

    send("{right}")
    sleep(100)
    send($array2[7])

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

    send("{right}")
    sleep(100)
    send($array2[8])

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

    sleep(300)

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

    if $array[$i] = "" Then
    excelread()
    EndIf
    Next

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

    excelread()
    EndFunc

    [/autoit]

    kopiert die nötigen sachen aus dem programm, zeile für zeile und fügt die dann in einer ms access datenbank ein. paar vars scheinen nicht deklariert, das script ist nach oben hin aber noch größer, dort sind die vorhanden :)

    ich weiss, man hätte gegen ende noch ne schleife einbaun können, es sind aber nur 9 elemente die ich einfügen möchte.
    soweit läufts :D

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • So, hab mich jetz endlich mal genauer damit auseinander gesetzt. Vielleicht bringts dem ein oder anderen was:

    [autoit]

    func _gettok($1,$2,$3)
    $aTokens = StringSplit($1, $2)
    Return $aTokens[$3]
    EndFunc

    [/autoit]

    _gettok(text,segment,zeichen)

    Bsp.:
    _gettok("text test1 test2 test3",1," ") = text
    _gettok("text test1 test2 test3",2," ") = test1
    _gettok("text test1 test2 test3",3," ") = test2
    usw..

    Wenn ich jetz nurnoch wüsste, für was ich diese Funktion gebraucht hätte :D

    Grüße
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Womit denn? Mit den 4 Zeilen Code? Hättst ja wenigstens noch sinnvole Variablennamen wählen können, als 1, 2 und 3. ^^

  • die var-namen bringen mir/dir 0, wenn die in einer separaten 'include'-datei stehen ;)

    wenn mans benutzen will oder wird, sind die 3 felder nicht sooo schwer zu merken denk ich..
    abgesehen davon mach ichs sogar in mIRC immer falsch (vertausch die letzten beiden vars), obwohl ichs schon jahrelang nutz :D

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Dann machst du mit Sicherheit was falsch, oder ist dir schonmal aufgefallen das in den UDF-Funktionen sinnvolle Namen verwendet werden? Wie machst du das denn?

  • is doch wurscht wie ichs mach, solange es funktioniert...
    meine scripte wird sowieso nie irgendjemand anschauen oder zu gesicht bekommen, von daher is das vollkommen egal

    wenn du die funktion nutzen möchtest, bitte, bedien dich, füg sinnvolle variablennamen ein oder lass es.. das is jedem selbst überlassen

    bin halt kein vollprofi - und genau aus dem grund solltest du mich eher unterstützen, als sinnfreie kritik zu üben, danke für die aufmerksamkeit ;)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Na gut dann will ich dich mal unterstützen. Wie sieht denn dein Code aus wo includet wird, vielleicht ist irgendwo ein Fehler.

  • [autoit]

    func _gettok($1,$2,$3)
    $aTokens = StringSplit($1, $2)
    Return $aTokens[$3]
    EndFunc

    [/autoit]


    ?(
    Mit etwas errorhandling und "vernünftigen" Variablen sieht das dann so aus:

    [autoit]

    $test="C:\Programme\EventGhost\EventGhost.exe"

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

    $split=_stringsplit_ex($test, "\", 4)
    if @error then MsgBox(1, "", @error)
    MsgBox(1, "", $split)

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

    func _stringsplit_ex($sdata, $ssearch, $iret)
    local $aret=StringSplit($sdata, $ssearch)
    if @error then return SetError(1, 0, 0)
    if not IsInt($iret) then return SetError(2, 0, 0)
    If $iret > $aret[0] then return SetError(3, 0, 0)
    Return $aret[$iret]
    EndFunc

    [/autoit]