Textzeilen zusammenführen ...

  • Moin,

    ich habe ein Problem zum Haare raufen ... :cursing:

    Und zwar möchte ich ein Textfile einlesen und bestimmte Zeilen bearbeitet zusammenführen und das ganze dann wieder in ein Textfile schreiben.
    Der Text wird auch geschrieben, aber nicht in veränderter Form, sondern unbearbeitet, also praktisch eine Kopie. 8|

    Geht nicht ...

    Spoiler anzeigen
    [autoit]

    $sPathRegFile = 'J:\AutoIt\Re.reg'

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

    $fhRegFile = FileOpen($sPathRegFile, 0)
    If FileReadLine($fhRegFile, 1) = 'REGEDIT4' Then
    $iVersionRegedit = 4
    Else
    $iVersionRegedit = 5
    EndIf
    $fhTmpFile = FileOpen(FileCopy($sPathRegFile, StringReplace($sPathRegFile, '.reg', '.tmp')), 2)
    FileWrite($fhTmpFile, StringReplace(FileRead($fhRegFile), ',\' & @CRLF & ' ', ','))
    FileClose($fhRegFile)
    FileClose($fhTmpFile)

    [/autoit]


    ... geht auch nicht !

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <Array.au3>

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

    $sPathRegFile = 'J:\AutoIt\Re.reg'

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

    $fhRegFile = FileOpen($sPathRegFile, 0)
    If FileReadLine($fhRegFile, 1) = 'REGEDIT4' Then
    $iVersionRegedit = 4
    Else
    $iVersionRegedit = 5
    EndIf
    $fhTmpFile = FileOpen(StringReplace($sPathRegFile, '.reg', '.tmp'), 2)
    $arText = StringSplit(FileRead($fhRegFile), @LF)
    ;_ArrayDisplay($arText)
    Dim $sConvText
    For $i = 1 To $arText[0]
    Select
    Case StringRegExp($arText[$i], '((hex\(?0?3?\)?:)[[:xdigit:]]{2}(,[[:xdigit:]]{2})*,\\)\z') = 1
    $sConvText &= StringTrimRight($arText[$i], 1)
    Case StringRegExp($arText[$i], '\A( [:xdigit:]]{2}(,[[:xdigit:]]{2})*,\\)\z)') = 1
    $sConvText &= StringTrimLeft(StringTrimRight($arText[$i], 1), 2)
    Case StringRegExp($arText[$i], '\A( [[:xdigit:]]{2}(,[[:xdigit:]]{2})*)\z') = 1
    $sConvText &= StringTrimLeft($arText[$i], 2)
    Case Else
    $sConvText &= $arText[$i]
    EndSelect
    Next

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

    FileWrite($fhTmpFile, $sConvText)
    FileClose($fhRegFile)
    FileClose($fhTmpFile)
    Exit

    [/autoit]

    Re.reg

    Spoiler anzeigen
    Code
    Windows Registry Editor Version 5.00
    
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG]
    "Seed"=hex(03):ea,8d,d8,7d,2c,82,21,2f,bb,85,91,62,a2,3a,b3,44,61,d3,55,de,\
      49,3c,3e,55,b6,ef,f0,78,9f,99,2f,5c,f6,73,12,af,82,e7,26,8f,85,0f,17,17,3e,73,\
      39,91,4b,0f,03,4e,11,6f,b2,34,51,5c,0a,77,77,b0,65,ee,8d,8f,00,3d,a3,9a,68,\
      41,15,49,3c,62,5b,12,b3,4a

    Keine Ahnung, was los ist, eigentlich müssten beide Beispiele funktionieren ...

    Gruß
    Greenhorn


    3 Mal editiert, zuletzt von Greenhorn (19. Januar 2008 um 19:29)

    • Offizieller Beitrag

    Hi,

    soll das nachher so aussehen?

    Spoiler anzeigen

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG]
    "Seed"=hex(03):ea,8d,d8,7d,2c,82,21,2f,bb,85,91,62,a2,3a,b3,44,61,d3,55,de,49,3c,3e,55,b6,ef,f0,78,9f,99,2f,5c,f6,73,12,af,82,e7,26,8f,85,0f,17,17,3e,73,39,91,4b,0f,03,4e,11,6f,b2,34,51,5c,0a,77,77,b0,65,ee,8d,8f,00,3d,a3,9a,68,41,15,49,3c,62,5b,12,b3,4a

    So long,

    Mega

  • Achtung: Exportierte Reg-Dateien ab Windows 2000, sind standardmäßig UNICODE !

    Das heißt aus dem CRLF ( Hex '0d 0a' ) wird dann Hex '0d 00 0a 00'. Andere Zeichen
    natürlich auch....

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • @Mega

    Jawollja, genau das soll es werden.
    Ich möchte die hex Werte in eine Zeile bekommen !!!

    @Micha

    Die hex Werte für REG_MULTI_SZ und REG_EXPAND_SZ in 'Windows Registry Editor Version 5.00' sind Unicode und haben, wie Du ganz richtig gesagt hast, immer ein Nullzeichen hinter dem hex Wert, aber die *.reg Datei selbst ist ANSI ...


    3 Mal editiert, zuletzt von Greenhorn (19. Januar 2008 um 18:33)

    • Offizieller Beitrag

    HI,

    so?

    [autoit]

    #include<File.au3>
    #include<Array.au3>
    Global $sPathRegFile = @ScriptDir & '\Reg.reg'
    Global $sPathRegFileTMP = @ScriptDir & '\Reg.tmp'
    Global $fhRegFile = FileOpen($sPathRegFile, 0)
    Global $fhRegFileTMP = FileOpen($sPathRegFileTMP, 2)
    Global $lines_A, $line = ''

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

    _FileReadToArray($sPathRegFile, $lines_A)

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

    For $i = 1 To $lines_A[0]
    If StringInStr($lines_A[$i], ',') Then
    $line &= StringStripWS(StringReplace($lines_A[$i], "\", ''), 8)
    Else
    FileWrite($fhRegFileTMP, $lines_A[$i] & @CRLF)
    EndIf
    Next
    FileWrite($fhRegFileTMP, $line)

    [/autoit]

    Mega

  • Klappt einwandfrei !!! Vielen Dank, Mega ! :thumbup:

    Aber kannst Du mir bitte sagen, was an meinen beiden Versuchen nicht stimmt ?
    Die Pattern stimmen, habe ich mit StringRegExpGUI getestet.
    Auch die andere Version (',\' & @CRLF & ' ' in einem FileRead) werden 'gemached', nur der StringReplace schlägt fehl !?

    Gruß
    Greenhorn


  • Habe es hinbekommen! 8o
    Es lag am FileRead ! Man muss den Parameter Count benutzen : FileRead($fhRegFile, FileGetSize($sPathRegFile)), dann klappt es.
    Wenn ich es nicht tue, dann wird die Datei nur bis zum Hex Code 15 (NAK - Negative acknowledge/Negative Rückgabe) eingelesen !!

    Ich habe es nun so gelöst:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sPathRegFile = @DesktopDir & '\Redo.reg'
    $fhRegFile = FileOpen($sPathRegFile, 0)
    ; Tempfile öffnen in die der modifizierte Text geschrieben werden soll.
    $fhRegFileTMP = FileOpen(StringReplace($sPathRegFile, '.reg', '.tmp'), 2)
    ; Datei in Array einlesen == _FileReadToArray
    $arText = StringSplit(StringStripCR(FileRead($fhRegFile, FileGetSize($sPathRegFile))), @LF)
    ;_ArrayDisplay($arText)
    Dim $sConvText
    For $i = 1 To $arText[0]
    If StringRegExp($arText[$i], '((hex\(?0?3?\)?:)[[:xdigit:]]{2}(,[[:xdigit:]]{2})*,\\)\z') Then
    $sConvText &= StringReplace($arText[$i], "\", '')
    ElseIf StringRegExp($arText[$i], '((,[[:xdigit:]]{2})*,\\)\z') Then
    $sConvText &= StringStripWS(StringReplace($arText[$i], "\", ''), 8)
    ElseIf StringRegExp($arText[$i], '(,[[:xdigit:]]{2})\z') Then
    $sConvText &= StringStripWS($arText[$i], 8) & @CRLF
    Else
    $sConvText &= $arText[$i] & @CRLF
    EndIf
    Next

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

    FileWrite($fhRegFileTMP, $sConvText)
    FileClose($fhRegFile)
    FileClose($fhRegFileTMP)
    Exit

    [/autoit]

    Ergebnis:

    Code
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG]
    "Seed"=hex(03):ea,8d,d8,7d,2c,82,21,2f,bb,85,91,62,a2,3a,b3,44,61,d3,55,de,49,3c,3e,55,b6,ef,f0,78,9f,99,2f,5c,f6,73,12,af,82,e7,26,8f,85,0f,17,17,3e,73,39,91,4b,0f,03,4e,11,6f,b2,34,51,5c,0a,77,77,b0,65,ee,8d,8f,00,3d,a3,9a,68,41,15,49,3c,62,5b,12,b3,4a


    Nochmals vielen Dank, Mega !!!
    Ohne den _FileReadToArray wäre ich nie drauf gekommen !

    Gruß
    Greenhorn


  • Ich will nur sicher gehen, dass die Zeilen Hex Code enthalten, denn die eigentlichen *.reg Dateien, die ich verarbeiten möchte enthalten natürlich noch alle anderen Werte, also REG_SZ usw., und ich weiß nicht, ob in diesen Werten nicht auch zufallig ähnliche Merkmale zu finden sind ...

    Gruß
    Greenhorn