1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Einfaches Programm zum Zeilen Löschen

    • BugFix
    • 28. April 2014 um 15:48
    Zitat von misterspeed

    dass es kein Problem sein sollte diese komplett im RAM vorzuhalten und in einem rutsch zu schreiben


    Nun, die Speicherverwaltung in Windows ist ja hervorragend gelöst und somit hatte ich beim Versuch die Daten kpl. zu cashen (800 MB - Datei) ein Memory Leak. :rofl: (ich habe ja auch nur 8 GB RAM verbaut :P)

  • Einfaches Programm zum Zeilen Löschen

    • BugFix
    • 28. April 2014 um 14:51

    Aufgrund der Dateigröße, kann man die Datei ja nicht einlesen und in ein Array splitten. Also bleibt nur das zeilenweise lesen und dann selektieren zum neu schreiben.
    Hierbei ist es sinnvoll die Daten zu sammeln und in 50 MB-Blöcken zu schreiben. Eine Datei mit 600 Zeichen je Zeile kommt mal locker auf eine halbe Million Zeilen bei Dateigröße ~500 MB. Da ist es natürlich Quatsch jede Zeile einzeln in die neue Datei zu schreiben. Dann dauert das Erstellen gut 20 min, so sind es rund 20 sec. ;)

    misterspeed: Wenn jede Zeile gelesen wird, darfst du keinesfalls mit einem Zeilenzähler die gewünschte Zeile angeben. Dann wird jedesmal vom Anfang bis zu dieser Zeile gelesen. Gibst du nichts ein, gilt: Next Line, ohne dass das bisherige nochmal eingelesen wird. Der Pointer steht ja bereits am Ende der zuletzt gelesenen Zeile.

    [autoit]

    $sPath = @ScriptDir & '\TestBigFile.txt' ; == Datei zum Einlesen
    $sPathOut = @ScriptDir & '\TestBigFileOut.txt' ; == Datei für Ausgabe

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

    $iLineDeleteFirst = 100 ; == erste zu löschende Zeile
    $iLineDeleteLast = 200 ; == letzte zu löschende Zeile

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

    $fH = FileOpen($sPath)
    $fHOut = FileOpen($sPathOut, 1)

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

    $sWrite = ''
    $iLine = 0
    While True
    $iLine += 1
    $sLine = FileReadLine($fH)
    If @error Then
    If $sWrite <> '' Then FileWrite($fHOut, $sWrite)
    ExitLoop
    EndIf
    If $iLine < $iLineDeleteFirst Or $iLine > $iLineDeleteLast Then
    $sWrite &= $sLine & @CRLF
    If StringLen($sWrite) > 50*1024*1024 Then ; immer 50 MB sammeln zum Schreiben, dauert sonst zu lange
    FileWrite($fHOut, $sWrite)
    $sWrite = ''
    EndIf
    EndIf
    WEnd
    FileClose($fH)
    FileClose($fHOut)

    [/autoit]
  • CSV (Zeilen) parsen mit korrektem Handling von escaping

    • BugFix
    • 28. April 2014 um 10:26

    Kleiner Nachtrag:
    Es war schon zu kompliziert gedacht, erst das innere Semikolon zu ersetzen, dann zu splitten und anschließend wieder einfügen.
    Einfacher gehts, wenn man die Zeile sofort mit einem Pattern splittet, das beide Fälle berücksichtigt. So gehts:

    [autoit]

    $string = 'Peter;"Paul; the Best";Mary;Coca-Cola;"Beer; dark";Lemon'
    $aSplit = StringRegExp($string, '"[^;]*;[^;]*"|[^;]+', 3)
    For $i = 0 To UBound($aSplit) -1
    ConsoleWrite($aSplit[$i] & @CRLF)
    Next

    [/autoit]


    Kleine Erklärung zum Pattern:
    Durch die Pipe wird ein ODER abgefragt. Hier muß zuerst nach der Variante mit innerem Semikolon gefragt werden. Würde man zuerst den Match auf Semikolon als Feldtrenner durchführen, wäre keine Unterscheidung mehr in inneres und begrenzendes Semikolon möglich.


    Edit:
    Damit das etwas flexibler ist, habe ich das mal in eine UDF gepackt.
    Hiermit hast du die Möglichkeit
    - Felder, die intern den csv-Trenner enthalten, mit beliebigen (auch paarigen!) Zeichen einzufassen
    - csv-Dateien mit unterschiedlichen Trennern zu nutzen

    _CSV_SplitLine()
    [autoit]

    $string = 'Peter;[Paul; the Best];Mary;Coca-Cola;[Beer; dark];Lemon'

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

    $aSplit = _CSV_SplitLine($string, '[]')
    For $i = 0 To UBound($aSplit) -1
    ConsoleWrite($aSplit[$i] & @CRLF)
    Next

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

    ;===================================================================================================
    ; Function Name....: _CSV_SplitLine
    ; Description......: Splits a csv-line into field values
    ; Parameter(s).....: $_sLine The line from csv-file
    ; .....optional....: $_sEdge Characters are enclosed with the fields that contain a delimiter. Default: '"'
    ; .................: By using two chars (opening and closing, i.e. <..>) commit them in a string without any other char (i.e. "<>")
    ; .....optional....: $_sSeparator The csv-separator character. Default: ';'
    ; Return Value(s)..: Array with one field in each item
    ; Author...........: BugFix ([email='AutoIt@bug-fix.info'][/email])
    ;===================================================================================================
    Func _CSV_SplitLine($_sLine, $_sEdge='"', $_sSeparator=';')
    Local $sEdgePre = $_sEdge, $sEdgePost = $_sEdge
    If StringLen($_sEdge) = 2 Then
    $sEdgePre = StringLeft($_sEdge, 1)
    $sEdgePost = StringRight($_sEdge, 1)
    EndIf
    If StringInStr('\.^$|[({*+?#', $sEdgePre) Then $sEdgePre = '\' & $sEdgePre
    If StringInStr('\.^$|[({*+?#', $sEdgePost) Then $sEdgePost = '\' & $sEdgePost
    If StringInStr('\.^$|[({*+?#', $_sSeparator) Then $_sSeparator = '\' & $_sSeparator
    Local $sPattern = $sEdgePre & '[^' & $_sSeparator & ']*' & $_sSeparator & '[^' & $_sSeparator & ']*' & $sEdgePost & '|[^' & $_sSeparator & ']+'
    Return StringRegExp($_sLine, $sPattern, 3)
    EndFunc ;==>_CSV_SplitLine

    [/autoit]
  • CSV (Zeilen) parsen mit korrektem Handling von escaping

    • BugFix
    • 27. April 2014 um 21:50

    Du mußt ja unterscheiden können in csv-Semikolon und Senikolon innerhalb von Gänsefüßchen.
    Innerhalb der Gänsefüßchen hast du theoretisch die Möglichkeit, dass das Semikolon direkt am Anfang, irgendwo drin oder am Ende steht. Die negative Character-Class deshalb, damit du alle Zeichen ausser diesem einen triffst. Du brauchst ja zwingend die Reihenfolge: Gänsefüßchen - irgendwas mit Semikolon drin - Gänsefüßchen. Um die Gänsefüßchen eindeutig zu matchen mußt du alles was davor und danach steht über die Class nicht Gänsefüßchen matchen. Ein .* würde jedes beliebige Zeichen, also auch das Gänsefüßchen matchen. Das könnte man auch mit einem "positive Lookahead" für das Gänsefüßchen lösen, aber diese Methode ist im Vergleich zur negative Class langsamer.

  • Codeing Practise

    • BugFix
    • 27. April 2014 um 21:07
    Zitat von chesstiger

    @Bug Ab 3.3.9.X kann man auch leere Arrays nutzen ($array[0]).


    :P Meine höchste AutoIt-Version ist 3.3.8.x -- Mehr kommt mir nicht auf den Tisch.

  • Codeing Practise

    • BugFix
    • 27. April 2014 um 21:03
    Zitat von hausl78

    Was hab ich übersehen?


    Nichts, wenn du eine Funktion verwendest, die eine Array-Variable ByRef verwendet (z.B. _FileReadToArray) dann nimmst du einfach $array, in allen anderen Fällen ein undimensioniertes $array[1].

  • CSV (Zeilen) parsen mit korrektem Handling von escaping

    • BugFix
    • 27. April 2014 um 20:55

    ([^"]*"[^;]*)  -- Ergebnis in ein Capture
    ([^"]*"[^;]*) -- Class: kein " null-mal bis beliebig oft
    ([^"]*"[^;]*) -- einmal "
    ([^"]*"[^;]*) -- Class: kein Semikolon null mal bis beliebig oft
    (;) -- Ergebnis in ein Capture
    (;) --einmal Semikolon
    ([^;]*"[^"]*) -- Ergebnis in ein Capture
    ([^;]*"[^"]*) -- Class: kein Semikolon null mal bis beliebig oft
    ([^;]*"[^"]*) -- einmal "
    ([^;]*"[^"]*) -- Class: kein " null-mal bis beliebig oft

  • CSV (Zeilen) parsen mit korrektem Handling von escaping

    • BugFix
    • 27. April 2014 um 19:28

    Einfach ein RegEx auf den gesamten csv-Inhalt loslassen, das prüft ob ein escapter Eintrag dabei ist. Danach entscheidest du das weitere Vorgehen.

  • CSV (Zeilen) parsen mit korrektem Handling von escaping

    • BugFix
    • 27. April 2014 um 17:30

    Verwende zum Maskieren einfach ein Zeichen, dass du wohl mit Sicherheit nicht im Text hast (z.B. Chr(1) ). Aber nicht Chr(0) verwenden, das ist intern die Stringbegrenzung und würde somit fehlschlagen. ;)
    Es ist ohne Sinn, nur zum Maskieren eine Zeichenkombination zu verwenden. Ein Einzelzeichen tut es.

  • CSV (Zeilen) parsen mit korrektem Handling von escaping

    • BugFix
    • 27. April 2014 um 14:28

    Ersetze das innere Semikolon mit einem Zeichen deiner Wahl (im Bsp. die Pipe). Dann splitten und hinterher mit umgekehrtem Weg statt Pipe wieder das Semikolon.

    [autoit]

    $string = 'Peter;"Paul; the Best";Mary;Coca-Cola;"Beer; dark";Lemon'
    $sDelim = '|'

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

    $sReplaced = StringRegExpReplace($string, '([^"]*"[^;]*)(;)([^;]*"[^"]*)', '$1' & $sDelim & '$3')
    ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $sReplaced --> " & $sReplaced & @LF)

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

    $aSplit = StringSplit($sReplaced, ';')

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

    If StringInStr('\.^$|[({*+?#', $sDelim) Then $sDelim = '\' & $sDelim ; mask meta characters
    For $i = 1 To $aSplit[0]
    ConsoleWrite(StringRegExpReplace($aSplit[$i], '"([^' & $sDelim & ']*)(' & $sDelim & ')([^' & $sDelim & ']*)"', '$1;$3') & @LF)
    Next

    [/autoit]

    Ergebnis:

    Code
    @@ Debug line	1693   var: $sReplaced --> Peter;"Paul| the Best";Mary;Coca-Cola;"Beer| dark";Lemon
    Peter
    Paul; the Best
    Mary
    Coca-Cola
    Beer; dark
    Lemon
  • Label nachträglich dynamisch hinzufügen

    • BugFix
    • 26. April 2014 um 10:18

    Du brauchst nicht extra GuiGetCursorInfo() aufrufen. Verwende einfach den erweiterten Modus

    [autoit]

    $aMsg = GuiGetMsg(1)

    [/autoit]

    Dann erhältst du ein Array mit

    Zitat von AutoIt-Hilfe

    - $array[0] = 0 oder Ereignis-ID oder Control-ID
    - $array[2] = Der Control-Handle des Controls, von dem das Ereignis gemeldet wird (gegebenenfalls)


    Und somit hast du bereits die Info über das Control, von dem die Msg kam. Spart dir einen Funktionsaufruf.
    Im OnEvent-Mode sollten dir die Event-Makros helfen.

  • Label nachträglich dynamisch hinzufügen

    • BugFix
    • 25. April 2014 um 16:40

    Mein Lieblings-Bsp. dafür:

    [autoit]

    Global $GUI, $aInput[2] = [1], $btAdd

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

    $GUI = GUICreate('Test', 400, 50)
    $aInput[1] = GUICtrlCreateInput('', 10, 10, 300, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    $btAdd = GUICtrlCreateButton('Add Input', 320, 10, 70, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btAdd
    _NewCtrl()
    EndSwitch
    WEnd

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

    Func _NewCtrl()
    Local $iDiff = 31 ; == Abstand + Höhe ==> 10 + 21
    Local Static $iY = 10 ; == Startwert vom ersten Ctrl
    $iY += $iDiff
    $aInput[0] += 1
    ReDim $aInput[$aInput[0]+1]
    Local $aWin = WinGetPos($GUI)
    WinMove($GUI, '', $aWin[0], $aWin[1], $aWin[2], $aWin[3] + 31)
    $aInput[$aInput[0]] = GUICtrlCreateInput('', 10, $iY, 300, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    EndFunc

    [/autoit]

    Kannst du mit jedem Ctrl machen.

  • !! Bildschirm !!

    • BugFix
    • 24. April 2014 um 17:55

    Es bleibt aber zu sagen, dass der Resize-Modus nicht sehr zuverlässig arbeitet. Du merkst das, wenn du das Fenster mehrfach auf- und zuziehst. Wenn du einen Resize-Modus gewählt hast, der auch die Controlgröße mit anpasst, werden diese unkontrollierte Maße annehmen.

  • Umlaute und Sonderzeichen konvertieren

    • BugFix
    • 24. April 2014 um 16:11

    Ich kann dein Problem nicht nachvollziehen.

    [autoit]

    $sChar = ChrW(8223)
    $sRep = '&#8232'

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

    $string = 'abcde' & $sChar & 'fghi'
    ConsoleWrite(StringInStr($string, $sChar) & @LF)

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

    ConsoleWrite(StringReplace($string, $sChar, $sRep) & @LF)

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

    #cs -- Output

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

    6
    abcde&#8232fghi

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

    #ce

    [/autoit]
  • CSS - Nachhilfe

    • BugFix
    • 23. April 2014 um 10:35
    Zitat von YaeroxXO

    und die Bereiche sollen aber die Seite voll ausnutzen nur dann ohne Inhalt.


    Ich glaube jetzt verstehe ich erst was du meinst. Es geht dir nicht um den Inhalt (Text) sondern um den Background.

    Wenn dem so ist, fasse ich mal zusammen:
    - wir haben 3 div's (header, navi, content) mit unterschiedlichem Background (Anordnung, wie in deinem Startpost)
    - alle div's sind von einem gemeinsamen Rahmen umfasst (so interpretiere ich deinen Wrapper)
    - navi hat fixe Breite
    - Höhe von navi und content soll immer identisch sein und sich am Inhalt orientieren
    - es soll immer die volle Höhe mit Background ausgefüllt sein

    Ist das soweit korrekt?
    Dann bleibt noch die Frage für die Breite (header, content). Ausweiten auf gesamten Bereich oder gibst du einen Max-Wert vor?

  • CSS - Nachhilfe

    • BugFix
    • 23. April 2014 um 09:51
    Zitat von YaeroxXO

    Sprich keine Scrollbars, aber dennoch soll die Seite komplett ausgefüllt sein.


    Das ist ein Widerspruch in sich:
    - keine Scrollbars heißt, dass der Inhalt (egal wieviel) dynamisch in den sichtbaren Bereich eingepasst wird, somit auch die Höhe fix ist
    - d.h. logischerweise, dass bei wachsendem Inhalt und einer fix vorgegebenen Breite die einzige Möglichkeit um mehr Inhalt unterzubringen bedeutet: Schrift verkleinern bis zum nicht sichtbar ;)

    Du solltest dein Konzept mal durchdenken. Bei variablen Inhalten muss mindestens ein Parameter des Containers ebenfalls variabel sein. Einzige Alternative wäre noch, dass du bei fixer Größe den Inhalt in separaten Seiten speicherst und per Button (vor / zurück) lädst, sofern die Containergröße durch den Inhalt aufgebraucht ist.

  • Berufsunfähigkeitsversicherung als Selbständiger Informatiker, geht das ?

    • BugFix
    • 15. April 2014 um 19:34

    Wie chip sagte - kontaktiere deine Versicherung. Einer BU liegt im Allgemeinen ein bestimmter Beruf beim Abschluß zugrunde. Kann dieser nicht mehr ausgeübt werden, greift die BU.
    Solltest du deinen ausgeübten Beruf dort eingetragen haben, würde der Versicherungsfall eintreten. Ob das dann wirklich passiert, entscheidet aber ein Gutachten der Versicherung. Und das kann a) dauern und b) wird es nicht als Ziel haben die Versicherung auszuzahlen. Also wenig Hoffnung für dich.

  • doppelte Einträge finden, jedoch nur Text bis zu bestimmten Zeichen vergleichen

    • BugFix
    • 12. April 2014 um 17:34
    SQL
    a.disk Or b.disk In ('HD 1')

    Da hast du wohl was vergessen, wenn du nur auf 'HD 1' prüfst, bekommst du auch nix anderes. ;) Im In-Statement erstellst du eine Liste von möglichen Übereinstimmungen und auf diese wird geprüft.

  • doppelte Einträge finden, jedoch nur Text bis zu bestimmten Zeichen vergleichen

    • BugFix
    • 12. April 2014 um 13:59
    SQL
    And (a.disk = 'HD 1' or b.disk = 'HD 1') Or (a.disk = 'HD 2' or b.disk = 'HD 2')

    hier würde ich IN verwenden:

    SQL
    And (a.disk Or b.disk In('HD 1', 'HD 2'))
  • AuoIt-Code wie VBA-Vorlage (DotNet DLL in VBA nutzen)

    • BugFix
    • 12. April 2014 um 10:29

    Meines Wissens kann AutoIt nur sehr begrenzt mit Objekten arbeiten. NET-Objekte gehören nicht dazu. Somit bringt es auch nichts, diese über die ansprechbaren VBA-Objekte einzuschleusen. Der Zugriff wird nicht gelingen.
    Du kannst eigene Klassen über einen kleinen Kunstgriff erstellen und nutzen, siehe hier.
    Einschränkend muß ich darauf verweisen, dass dies zumindest bis Stable 3.3.8.1 der Fall war. Ob sich in der aktuellen Version da was getan hat, weiß ich nicht, ich nutze diese nicht.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™