Zeilenweises Löschen in Textdatei: A bis B

  • Hallo,

    ich möchte Folgendes automatisieren:

    • Textdatei öffnen
    • Startzeile finden (z.B. per RegExp), Zeilennummer ermitteln (A)
    • optional: Endzeile finden (s.o.), Zeilennummer ermitteln; alternativ: letzte Zeile/letzter Umbruch verwenden (B)
    • von einschließlich A bis inklusive B löschen
    • Änderungen speichern (trivial)

    Manuell würde ich mit Hilfe von GVim folgendermaßen vorgehen:

    • /.*Suchmuster → eindeutiger Treffer in Zeile A (B sei letzte Zeile in Datei)
    • :A,Bd → Lösche (delete) die Zeilennummern A bis (einschließlich) B
    • :x → schreibe Puffer/übernehme Änderungen

    Wie könnte ein halbwegs... eleganter Ansatz für AutoIt aussehen; so grundsätzlich...?
    Mir geht's hauptsächlich um A und ggf. B (bzw. letzte Zeile ^[\w\s]+$).

    Danke für eure Ideen!

    Ein Neuling

    Einmal editiert, zuletzt von Neophytus (12. Juni 2013 um 19:15)

  • Eigentlich hast du schon alles wichtige zur Hand (denke ich).

    Mein Vorgehen wäre folgendermaßen:
    - 1. Per _FileReadToArray die Datei einlesen
    - 2. Mit Regex meine Start bzw Endzeile finden
    - 3. Entweder _ArrayDelete in einer Schleife nutzen um alles von A bis B zu löschen (beides inklusive), oder die Funktion für 1D Arrays so umschreiben, dass sie Start und Ziel akzeptiert (nur wenn Tempo gebraucht wird)
    - 4. Mit _FileWriteFromArray meine Datei schreiben.

    Ob das jetzt elegant ist kann ich icht beurteilen, es müsste aber so gehen.
    In Arrays arbeiten ist idr schneller und leichter als in Dateien. (Da Arrays direkt zugänglich sind und im Ram liegen statt auf der Platte)

    lg
    M

  • Sollte vielleicht noch ergänzen, dass Entfernen von A bis B nur ein Teil der Behandlung ist.
    Im ersten Teil des Skripts lese ich per FileRead die Datei komplett ein um eine Reihe von StringRegExpReplace-Befehlen drauf loszulassen, wobei ich das evtl. auch später tun könnte...

    Es geht um Input jener Art. Dadrin suche ich (regulär) den letzten ;-Abschnitt zum Entfernen, evtl. ist es nicht mit einem Löschvorgang getan. Weiß grade nicht, ob Geschwindigkeit Priorität hat (schätze eher nicht), aber ich habe so ByRef-Funktionsgedöns vor Augen... muss mich noch mehr an AutoIt-Syntax gewöhnen...

    Ich stricke den Kram so lange um bis ich das Endergebnis als adblock.ini mit dem SRware Iron verwenden kann, so jedenfalls mein Plan... :whistling:

  • Wenn du die StringRegExpReplaces später machen kannst, dann würde ich vielleicht die Datei schon anders einlesen.

    Zeilenweise einlesen, wenn StringRegExp( ANFANG ) gefunden ist einen Flag setzen, dass in der Zeit nichts getan werden muss, bis die Zeile mit StringRegExp( ENDE ) gefunden ist. Sollten deine sonstigen StringRegExpReplaces zwischen A und B etwas bearbeiten wird dies doch eh gelöscht und somit unnötig.

    Die alternativlösung mit letzte Zeile/Umbruch suchen durch einen Umbruch würde ich niemals empfehlen. Die Texte haben doch sicherlich ein Muster an dass du dich halten kannst oder?

    So Far

    Grüße Yaerox

    Grüne Hölle

  • YaeroxXO, ich habe so eine Ini testweise mal per _FileReadToArray eingelesen.
    Reguläre Ersetzungen (insg. 6-10) habe ich erst mal hintangestellt (Teil 2).

    Teil 1:
    Ich nudle Fanboys Datei-Array per RegExp-Match durch (Iterationsvariable läuft mit) und bekomme $A.

    Per $aFileArray[0] kenne ich das letzte Element = die letzte Zeile und somit $B.
    (Da's erst mal ein Quick-n-dirty-Ansatz ist, prüfe ich an dieser Stelle nicht auf Mehrfachvorkommen usw.)

    Ich könnte also $aFileArray von B nach A durchnudeln und _ArrayDelete($aFileArray, $i) darauf ansetzen.
    Geht's eventuell klüger/kürzer, vielleicht eine inoffizielle Array-Funktion _ArrayDeleteRange($aFileArray, $A, $B)?

    Die Dateien liegen übrigens größenmäßig bei 12T - 20T Zeilen.
    Wenn ich 2 Datei-Arrays kombiniere bekomme ich also bis zu 40T Elemente.

  • Vielleicht magst du ja nochmal detailierter erklären was aus der Datei entfernt bzw. in welcher Form ersetzt werden soll. Anhand der Beispieldatei und deiner Beschreibung willst du lediglich die paar Kommentarzeilen am anfang der ini Datei entfernen. da würde ich nicht lang mit irgendwelchen Index Suchereien rum machen. Angenommen du hast den Kram schon zeilenweise in einem array:

    [autoit]


    $aSource = _filereadtoarray(...)
    dim $aNew[ubound($aSource)]
    $j = 0
    for $i=1 to ubound($aSource)-1
    if stringleft($aSource[$i],1) <> ";" then
    $aNew[$j]=$aSource[$i] ; hier ggf. noch weitere stringreplace oder stringregexpreplace Methoden auf die "erlaubten" Strings anwenden...
    $j+=1
    endif
    next
    redim $aNew[$j]

    [/autoit]

    Ergebnis ist dann eine bereinigte Kopie des ursprünglichen Arrays. Sollte letztlich mindestens genauso, oder gar schneller gehen, da du das Array so oder so mindestens einmal komplett durchgehen musst um deine Ersetzungen durchzuführen.

  • Anhand der Beispieldatei und deiner Beschreibung willst du lediglich die paar Kommentarzeilen am anfang der ini Datei entfernen. [...]

    Ergebnis ist dann eine bereinigte Kopie des ursprünglichen Arrays.

    Korrekt, dieser Fall wäre allerdings trivial und wie du richtig bemerkst, ziemlich einfach zu lösen.

    Konkret, wenn du die verlinkte urlfilter.ini hast, diese enthält (wie andere Varianten auch) 1 Abschnitt "^.*\(Opera\sSpecific)", den ich für die Regex-Behandlung nicht gebrauchen kann (d.h. alles ab/inkl. der ; Zeile bis zum Ende des Blocks), also muss ich ihn zuvor löschen:

    Ich erhalte also für $A 13106 als Wert, $B entspricht 13169. Bleibt nur noch das Löschen dieser 63 Elemente über _ArrayDelete...
    (Jener Fall setzt voraus, dass nach A kein weiterer mit ; eingeleitete Block folgt, der nicht gelöscht werden darf.)

    Im 2. Teil folgen die StringRegExpReplaces. Keine Ahnung ob das so mit dem $aFileArray klappt; möglich dass ich den Inhalt erst mit _FileWriteFromArray als Datei zurückschreibe und anschließend noch mal mit FileRead einlesen muss... eben schön umständlich. :D

    Tja... 

  • Machts jetzt auch nicht komplizierter (siehe unten). Die Datei schreiben und neu einlesen für einen zweiten Schritt ist unnötig, wie in der Schleife angedeutet kannst du deine regexpreplaces auch direkt pro zeile durchführen und anschließend erst die bereinigte Zeile in $aNew[$j] speichern. Nach der Schleife biste dann fertig und kannst die Datei schreiben.

    [autoit]


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

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

    Global $timer = TimerInit()
    Global $aSource
    _filereadtoarray(@ScriptDir & "\filter.ini",$aSource)
    Global $aNew[ubound($aSource)]

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

    $j = 0
    for $i=1 to ubound($aSource)-1
    if stringinstr($aSource[$i],"; Complex Wildcards (Opera Specific)") then exitloop ; vorrausgesetzt dies ist immer der letzte Block der Datei und somit alles nachfolgende uninterressant...
    if stringleft($aSource[$i],1) <> ";" then
    $aNew[$j]=$aSource[$i] ; hier ggf. noch weitere stringreplace oder stringregexpreplace Methoden auf die "erlaubten" Strings anwenden...
    $j+=1
    endif
    next
    redim $aNew[$j]
    ;_ArrayDisplay($aNew)
    _FileWriteFromArray(@ScriptDir & "\filterneu.ini",$aNew)
    ConsoleWrite(TimerDiff($timer) & @CRLF)

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (26. Mai 2013 um 17:45)

  • Danke, ich teste das nachher mal mit den Varianten (cz/jpn/pol/rus) durch.

    Zu den StringRegExpReplaces: Ich war nicht sicher, wie sich das (geschwindigkeitsmäßig) auswirkt:
    n Ausdrücke pro Schleifenelement versus n Ausdrücke auf FileRead-Variable...

    Vorteil der $aFileArray-Sache ist natürlich, dass ich 2 Arrays verbinden und Duplikate entfernen kann.
    Mal schauen wie das in AutoIt klappt... ;)

    Gruß,
    ein Neuer

  • Das ^ist es leider noch nicht. Zwar bekomme ich über den _FileReadtoArray-Ansatz den Block gelöscht, allerdings klappen meine Regex-Ersetzungen so nicht mehr. Zum Beispiel muss ich global alle "*" durch Nullstrings ersetzen oder reguläre Vorkommen "&amp;?" durch "&" usw.
    Mit FileRead() bekam ich die Dateiinhalts-Variable auf die ich problemlos alle StringRegExpReplace anwenden konnte.

  • Warum soll das nicht auch Zeilenweise gehen? Du hast nun eben keinen Gesamtstring (fileread) mehr, sondern nur noch viele Einzelstrings, gespeichert in $aSource[$i]. An deinen RegExp Pattern dürfte sich dennoch nichts (oder nur minimal) etwas ändern. Da wir aber keine Hellseher sind und du bis auf die zwei Beispiele gerade eben keinerlei Angaben dazu gemacht hast was du wie ersetzen willst, bzw. bisher mit welchen Pattern ersetzt hast kann hier auch keiner definitiv sagen was falsch läuft.

  • Langsam werd' ich verwirrt :D

    Also ich habe an sowas gedacht:

    Script
    [autoit]

    Local $hFile = FileOpen("file.txt")
    Local $hFile2 = FileOpen("file2.txt", 2)
    Local $bStartFound = False

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

    While 1
    Local $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop

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

    If $bStartFound = False Then
    If Not StringRegExp($sLine, "d") Then ;USE START PATTERN HERE
    FileWriteLine($hFile2, $sLine)
    Else
    $bStartFound = True
    EndIf
    Else
    If StringRegExp($sLine, "l") Then
    FileWriteLine($hFile2, $sLine) ;USE END PATTERN HERE
    Else
    $bStartFound = False
    EndIf
    EndIf
    WEnd

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

    FileClose($hFile)
    FileClose($hFile2)

    [/autoit]
    file.txt

    Dies ist allerdings auch noch keine 100%ige Variante, da ich einfach das Alphabet gebrochen in eine Textdatei geschrieben habe. Du müsstest halt schauen ob die PATTERNS bei dir auch nur in dieser Reihenfolge auftauchen können, sonst musst du halt noch ein paar Sachen abfangen.

    So Far

    Grüße Yaerox

    Grüne Hölle

  • Mein Q'n'd-Entwurf für Teil 1:

    Spoiler anzeigen

    Der tut was er soll (nämlich A bis B löschen).

    Was nicht funktioniert, ist Teil 2:

    Code
    For $line In $FileArr
       $line = StringRegExpReplace($line, '^;.*\n', "")
       $line = StringRegExpReplace($line, '^prioritize.*\n', "")
       $line = StringRegExpReplace($line, '^\*?:\/\/.+\n', "")
       $line = StringRegExpReplace($line, '\*', "")
       $line = StringRegExpReplace($line, '\[.+\]\s?\n', "")
       $line = StringRegExpReplace($line, '\&amp;?', "&")
       $line = StringRegExpReplace($line, '\n$', "")
    Next
    _FileWriteFromArray(@ScriptDir & "\rus_urlfilter_new.ini", $FileArr)


    Offenbar kann StringRegExpReplace so nicht auf meinen Array anwenden...
    :huh:

  • RIchtig.
    Eine For-In-Schleife erzeugt immer eine temporäre Kopie des Array-Elements. Du änderst also garnichts, praktisch wie Read-Only...
    Du musst eine For-To-Schleife verwenden, wodurch auf die Elemente per Referenz zugegriffen werden kann.

    [autoit]


    For $iLine = 0 To UBound($FileArr) - 1 ;Vom ersten bis zum letzten Element in $FileArr
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '^;.*\n', "")
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '^prioritize.*\n', "")
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '^\*?:\/\/.+\n', "")
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '\*', "")
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '\[.+\]\s?\n', "")
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '\&amp;?', "&")
    $FileArr[$iLine] = StringRegExpReplace($FileArr[$iLine], '\n$', "")
    Next
    _FileWriteFromArray(@ScriptDir & "\rus_urlfilter_new.ini", $FileArr)

    [/autoit]

    lg

  • So ist es, in mein obiges Script eingebaut sollte es so ausschaun, wobei ich mal annehme, dass deine regex Pattern so nicht mehr (alle) stimmen, da filereadtoarray bereits die Zeilenumbrüche entfernt, du müsstest also evtl deine Pattern entsprechend anpassen. Ich bin aber was das anbelangt nicht wirklich der Experte, verwende normalerweise keine regex pattern.

    Spoiler anzeigen
    [autoit]


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

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

    Global $timer = TimerInit()
    Global $aSource
    _filereadtoarray(@ScriptDir & "\filter.ini",$aSource)
    Global $aNew[ubound($aSource)]

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

    $j = 0
    for $i=1 to ubound($aSource)-1
    if stringinstr($aSource[$i],"; Complex Wildcards (Opera Specific)") then exitloop ; vorrausgesetzt dies ist immer der letzte Block der Datei und somit alles nachfolgende uninterressant...
    if stringleft($aSource[$i],1) <> ";" then
    $debugLine = $aSource[$i]
    $aSource[$i] = StringRegExpReplace($aSource[$i], '^;.*\n', "")
    $aSource[$i] = StringRegExpReplace($aSource[$i], '^prioritize.*\n', "")
    $aSource[$i] = StringRegExpReplace($aSource[$i], '^\*?:\/\/.+\n', "")
    $aSource[$i] = StringRegExpReplace($aSource[$i], '\*', "")
    $aSource[$i] = StringRegExpReplace($aSource[$i], '\[.+\]\s?\n', "")
    $aSource[$i] = StringRegExpReplace($aSource[$i], '\&amp;?', "&")
    $aSource[$i] = StringRegExpReplace($aSource[$i], '\n$', "")
    if $aSource[$i] = "" Then
    ConsoleWrite("Zeile wurde komplett entfernt: " & $i & " --> " & $debugLine & @CRLF)
    ContinueLoop ; wenn nach der Ersetzung nichts mehr in der Zeile steht brauchen wir auch nichts mehr ins Ergebnis Array schreiben
    EndIf
    $aNew[$j]=$aSource[$i]
    $j+=1
    endif
    next
    redim $aNew[$j]
    _ArrayDisplay($aNew)
    ;_FileWriteFromArray(@ScriptDir & "\filterneu.ini",$aNew)
    ConsoleWrite(TimerDiff($timer) & @CRLF)

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (30. Mai 2013 um 15:22)

  • Danke für die Anmerkungen.

    Ich habe das Skript überarbeitet, im groben und ganzen funzt es, ein paar Kleinigkeiten stören aber noch:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    Global $FileArr, $NewFileArr
    ; Datei lokal abgelegt, soll in Endfassung noch flexibilisiert werden...
    If _FileReadToArray(@ScriptDir & "\rus_urlfilter.ini", $FileArr) = 0 Then MsgBox(4096, "Error", "Error")
    $NewFileArr = StripArray($FileArr)
    $NewFileArr = ParseArray($NewFileArr)
    _FileWriteFromArray(@ScriptDir & "\output.ini", $NewFileArr)

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

    #cs --------------------------------------------------------------------------------
    Probleme: Neu geschriebene output.ini weist unnötigen Umbruch (@Crlf) am Ende auf
    --> löschen da sonst beim Verketten wieder Leerzeilen '(?m)\n$' entstehen.
    #ce --------------------------------------------------------------------------------

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

    Func StripArray($which)
    Local $A, $B
    Local $i=0
    $B = $which[0] ; Anzahl Arrayelemente
    $A = $B ; falls Suchmuster fehlt
    For $line In $which
    If StringRegExp($line, '.*Opera\sSpecific') Then
    $A = $i
    ExitLoop
    EndIf
    $i+=1
    Next
    If $B > $A Then ; nur falls Suchmuster gefunden
    For $rm=$B To $A Step -1
    _ArrayDelete($which, $rm)
    Next
    EndIf
    _ArrayDelete($which, 0) ; veraltete Größenangabe löschen (geht das auch einfacher?)
    Return $which
    EndFunc

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

    Func ParseArray($which)
    Local $retArr[UBound($which)]
    Local $j=0
    For $i=0 To UBound($which)-1
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(Fanboy.+)\s(\(.+\))', "# \1 (Iron)")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(?=Updated)', "# ")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^prioritize.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^\*?:\/\/.+', "")
    $which[$i] = StringRegExpReplace($which[$i], '\*', "")
    $which[$i] = StringRegExpReplace($which[$i], '\[.+\]\s?', "")
    $which[$i] = StringRegExpReplace($which[$i], '\&amp;?', "&")
    If StringRegExp($which[$i], '(?m)^$', 0) Then
    ContinueLoop
    EndIf
    $retArr[$j]=$which[$i]
    $j+=1
    Next
    ReDim $retArr[$j]
    Return $retArr
    EndFunc

    [/autoit]


    Ein Punkt: _FileWriteFromArray() scheint den Array mit abschließendem/redundantem Zeilenumbruch als Datei zu schreiben.
    Das möchte ich nicht! Gibt es eine Möglichkeit, das zu verhindern?
    Bei meinem allerersten FileRead-Entwurf ließ sich das mit StringRegExpReplace beheben...

  • Ich versteh zwar nicht warum du das unbedingt in 2 separaten Schritten machen willst, wenn es auch mit einem einzigen Schleifendurchlauf ginge (performanter), aber hier noch ein paar Anmerkungen zu deinen Fragen:


    [autoit]


    _ArrayDelete($which, 0) ; veraltete Größenangabe löschen (geht das auch einfacher?)

    [/autoit]

    Ja, du kannst es auch einfach bleiben lassen diesen Index zu löschen. Da du im 2. Schritt ohnehin eine Kopie des Arrays machst und den Wert aus Index 0 nicht verwendest, sondern vorbildlicherweise gleich "ubound" verwendest genügt es wenn du einfach erst ab Index 1 statt 0 anfängst zu "kopieren":

    [autoit]


    Func ParseArray($which)
    Local $retArr[UBound($which)]
    Local $j=0
    For $i=1 To UBound($which)-1 ; geändert...

    [/autoit]


    Zitat

    Ein Punkt: _FileWriteFromArray() scheint den Array mit abschließendem/redundantem Zeilenumbruch als Datei zu schreiben.
    Das möchte ich nicht! Gibt es eine Möglichkeit, das zu verhindern?
    Bei meinem allerersten FileRead-Entwurf ließ sich das mit StringRegExpReplace beheben...

    Sofern du filewritefromarray verwenden willst kannst du das nicht ändern. Du könntest aber anstatt mit einem Ergebnis Array zu arbeiten auch gleich einen verketteten String erzeugen und diesen selbst mit filewrite schreiben, filewritefromarray macht im Prinzip genau das, du sparst dir dabei sogar einen zusätzlichen Array Durchlauf und kannst auch selbst beeinflußen ob am Ende noch ein Zeilenumbruch landet oder nicht.

    Hier die modifizierte Fassung:

    [autoit]

    #include <Array.au3>
    ;...
    $NewFileArr = StripArray($FileArr)
    $sResult = ParseArray($NewFileArr)
    $hFile = fileopen(@ScriptDir & "\output.ini",2+8) ; Datei anlegen und sofern vorhanden alten Inhalt löschen
    filewrite($hFile,$sResult)
    fileclose($hFile)
    ;...
    Func ParseArray($which)
    Local $sReturn = ""
    ; Local $j=0
    For $i=0 To UBound($which)-1
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(Fanboy.+)\s(\(.+\))', "# \1 (Iron)")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(?=Updated)', "# ")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^prioritize.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^\*?:\/\/.+', "")
    $which[$i] = StringRegExpReplace($which[$i], '\*', "")
    $which[$i] = StringRegExpReplace($which[$i], '\[.+\]\s?', "")
    $which[$i] = StringRegExpReplace($which[$i], '\&amp;?', "&")
    If StringRegExp($which[$i], '(?m)^$', 0) Then
    ContinueLoop
    EndIf
    $sReturn &= $which[$i] & @crlf ; verkettet jede Zeile mit abschließendem Zeilenumbruch
    ; $retArr[$j]=$which[$i]
    ; $j+=1
    Next
    ; ReDim $retArr[$j]
    Return stringreplace($sReturn,@crlf,"",-1) ; entfernt das letzte Auftreten eines Zeilenumbruchs im String
    EndFunc

    [/autoit]
  • Danke, misterspeed, klappt bestens!

    Zwei Funktionen gibt es, weil

    • die Prüfung der Blöcke, die entfernt werden sollen, evtl. ausgebaut wird (hängt von Fanboy ab),
      damit bleibt es übersichtlicher
    • ich Kommentarzeilen von ; nach # überführe und nicht komplett entferne (z.B. Updated-Zeile)

    Einmal editiert, zuletzt von Neophytus (1. Juni 2013 um 15:07)

  • Nachtrag: Soweit klappt inzwischen alles.

    Wen es noch interessiert, es sieht jetzt so aus:

    Spoiler anzeigen
    [autoit]


    ; Converts Opera specific urlfilter.ini files for SRware Iron (more primitive adblock.ini syntax)
    #NoTrayIcon
    #include <Array.au3>
    #include <File.au3>

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

    Global $AdbMain, $AdbRus, $NewAdbMain, $NewAdbRus, $iniFetch, $outputFile

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

    If FileExists(@ScriptDir & "\adblock.ini") Then FileDelete(@ScriptDir & "\adblock.ini")
    $iniFetch = InetGet("http://www.fanboy.co.nz/adblock/opera/complete/urlfilter.ini", @ScriptDir & "\adb_main.ini", 4)
    If @error Then Exit
    $iniFetch = InetGet("http://www.fanboy.co.nz/adblock/opera/rus/urlfilter.ini", @ScriptDir & "\adb_rus.ini", 4)
    InetClose($iniFetch)

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

    If _FileReadToArray(@ScriptDir & "\adb_main.ini", $AdbMain) = 0 Then MsgBox(4096, "Error", "Reading adb_main.ini failed", 10)
    If _FileReadToArray(@ScriptDir & "\adb_rus.ini", $AdbRus) = 0 Then MsgBox(4096, "Error", "Reading adb_rus.ini failed", 10)

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

    $NewAdbMain = ReduceFile($AdbMain)
    $NewAdbMain = ConvRules($NewAdbMain)

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

    $NewAdbRus = ReduceFile($AdbRus)
    $NewAdbRus = ConvRules($NewAdbRus)

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

    $outputFile = FileOpen(@ScriptDir & "\adblock.ini", 10)
    FileWrite($outputFile, StringReplace($NewAdbMain & $NewAdbRus, @Crlf, '', -1))
    FileClose($outputFile)

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

    ; Description : Strips down given array
    ; Syntax : ReduceFile(ByRef $FileArray)
    ; Return values : Array
    Func ReduceFile($which)
    Local $A, $B
    Local $i=0, $j=0
    Local $returnArr[UBound($which)]
    $A = 1 ; Skip 0th element
    $B = $which[0]
    For $elem In $which
    If StringRegExp($elem, '.*Fanboy.s\s.+\-addon') Then $A = $i
    If StringRegExp($elem, '.*Opera\sSpecific') Then $B = $i
    $i+=1
    Next
    For $i=$A To $B
    $returnArr[$j] = $which[$i]
    $j+=1
    Next
    ReDim $returnArr[$j]
    Return $returnArr
    EndFunc

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

    ; Description : Parses and converts given array
    ; Syntax : ConvRules(ByRef $FileArray)
    ; Return values : String
    Func ConvRules($which)
    Local $returnStr = ''
    For $i=0 To UBound($which)-1
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(Fanboy.+)\s(\(.+\))', "# \1 (converted for Iron)")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(?=Updated)', "# ")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^prioritize.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^\*?:\/\/.+', "")
    $which[$i] = StringRegExpReplace($which[$i], '\*', "")
    $which[$i] = StringRegExpReplace($which[$i], '\[.+\]\s?', "")
    $which[$i] = StringRegExpReplace($which[$i], '\&amp;?', "&")
    If StringRegExp($which[$i], '(?m)^$', 0) Then
    ContinueLoop
    EndIf
    $returnStr &= $which[$i] & @Crlf
    Next
    Return $returnStr
    EndFunc

    [/autoit]