Array - Bestimmte Bereiche löschen

  • Hey!
    Ich möchte gerne einen Bestimmten Bereich in einem Array (1D) ersetzen.
    Dieser wird durch 2 bestimmte Wörter definiert (Kommen im Array öfter vor).
    Wenn dieser Bereich gefunden wird, soll er durch einen anderen Text/Wert im Array ersetzt werden (_StringReplace ?).
    Der Bereich ist jedoch unterschiedlich lang, daher kann man nicht einfach eine bestimmte Anzahl an Zeilen darüber und darunter löschen.

    Gibt es so etwas schon? Falls nicht - Könnt ihr mir bitte bei einem Lösungsansatz helfen?

    Vielen Dank für eure Hilfe!

  • Hallo Korby!

    alles klar?
    Schau Dir auch mal meinen Code zum Thema StringRegExp an (von heute abend), da ist ein Mustercode drin, ein Array abzuarbeiten.

    Wenn Unklarheiten, nochmals melden.

    Grüße

    German

  • Hallo!

    hier mein kleines Muster dazu:

    Spoiler anzeigen
    [autoit]


    ; Beispiel: Einlesen der Datei in ein Array
    ; Zeilenweises abarbeiten
    ; externe Funktion zum Austausch von Werten im Array

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

    #include <Date.au3>
    #include <string.au3>
    #include <array.au3>
    #include <file.au3>

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

    $testdatei=@workingdir & "\text3.txt"
    ; Inhalt der text3.txt:
    ;Schlosser
    ;Schreiner
    ;Dreher
    ;Telefontechniker

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

    Dim $myarray
    If Not _FileReadToArray($testdatei,$myarray) Then
    MsgBox(4096,"FEHELER", " Datei " & $textdatei & " nicht gefunden, oder leer")
    Exit
    EndIf
    _arraydisplay($myarray,"das wars vorher")

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

    For $x = 1 to Ubound($myarray) -1 ; jetzt wird das array von Zeile 1 bis zur lezten Zeile eingelesen
    $Zeile=$myArray[$x]
    msgbox(0,"ich hab jetzt die Zeile mit folgendem Inhalt:", $zeile)
    _checkandreplace($zeile,$x)
    Next

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

    _arraydisplay($myarray,"das wars danach")

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

    Func _checkandreplace($zeile,$x)

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

    SELECT
    case StringRegExp($zeile,'Schreiner')
    $neuezeile=StringReplace($zeile,"Schreiner","Tischler")

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

    _arraydelete($myarray,$x)
    _arrayInsert($myarray,$x,$neuezeile)

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

    case StringRegExp($zeile,'Schlosser')
    $neuezeile=StringReplace($zeile,"Schlosser","Maschinenbauer")
    _arraydelete($myarray,$x)
    _arrayInsert($myarray,$x,$neuezeile)
    case else
    Return 0
    ENDSELECT

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

    EndFunc

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

    nützt nur nix, daß nur Abzukupfern, verstehen muß mans auch (ich hab autoit auch im Selbststudium gelernt), daher keine Fragen scheuen, ob der Code so besonders flott geht hab ich jetzt aber nicht getestet.

    Grüße

    Holzwurm
    wer mit Fein und Festool schraubt, mit Mafell hobelt --> der hackt mit AUTOIT

  • Hi holzwurm,
    aus eigener Erfahrung kann ich sagen das das Skript zu lange brauch. Die Arrayfunktionen dauern allgemein ziemlich lange. Ich versuche deshalb immer so wenig wie möglich mit alles Arrayfunktionen zu arbeiten. Lieber Array in einen String packen, bearbeiten und wenn muß wieder in eine Array schreiben. Natürlich würde ich die Vorgehensweise von Xenobiologist bevorzugen. Geht einfach ohne viele zusätzliche Funktionen super schnell, da die autoitkerne in C (glaube ich) geschrieben sind.

    MfG
    Der_Doc

  • Hallo!

    hab gerade mal was von meinem bescheidenen Testbestandsmaterial aus der Firma genommen:
    Quelldatei 10000 Zeilen mit dem gleichen Wert 573122 werden durch XXXXXX ersetzt. (in jeder Zeile ist ein Treffer)

    Hier als Version mit Stringabarbeitung:
    Dauer (mitgeschnitten) 1 Sekunde

    die Variante von gestern (in array lesen und im array ändern) läuft seit ca. 10 Minuten!!!!
    wäre noch die Frage: ist StringInStr oder StringRegExp schneller??

    Grüße

    German
    PS: hier mit Code, war ja ne Frage eines Kollegen und ich habs auch immer gehasst, wenn jedes Anfangsproblem von den -Superäggsbärden- "zu tote" diskutiert worden ist und für mich als Fragesteller blieb nichts übrig
    PS1: hier steht schon ein PC mit anständig Dampf unter der Haube, falls einer die Messzeit ankreidet


    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Beispiel: Einlesen der Datei in ein Array
    ; Zeilenweises abarbeiten
    ; Austausch von gefundenem Text und Ausgabe als STring

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

    #include <Date.au3>
    #include <string.au3>
    #include <array.au3>
    #include <file.au3>

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

    $testdatei=@workingdir & "\mq573"
    $newfile=@workingdir & "\mq573a_a"

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

    ; Inhalt der text3.txt:
    ;Schlosser
    ;Schreiner
    ;Dreher
    ;Telefontechniker

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

    $pfile=Fileopen($newfile,1)

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

    Dim $myarray
    If Not _FileReadToArray($testdatei,$myarray) Then
    MsgBox(4096,"FEHELER", " Datei " & $textdatei & " nicht gefunden, oder leer")
    Exit
    EndIf

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

    For $x = 1 to Ubound($myarray) -1 ; jetzt wird das array von Zeile 1 bis zur lezten Zeile eingelesen
    $Zeile=$myArray[$x]
    ; msgbox(0,"ich hab jetzt die Zeile mit folgendem Inhalt:", $zeile)
    $Ausgabe=_checkandreplace($zeile)
    FileWrite($pfile, $Ausgabe & @CRLF)
    Next

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

    FileClose($pfile)

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

    Func _checkandreplace($zeile)

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

    SELECT
    case StringRegExp($zeile,'573122')
    $neuezeile=StringReplace($zeile,"573122","XXXXXX")
    Return $neuezeile
    ;_arraydelete($myarray,$x)
    ;_arrayInsert($myarray,$x,$neuezeile)
    case else
    Return $zeile
    ENDSELECT

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

    EndFunc

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