bestimmte Dateiinhalte löschen ?

  • Hallo Leute,

    wie kann ich in allen UCF-Dateien (können mit Notepad geöffnet werden) die unter c:\admin_V8\config\project_config\users\...\ in verschiedenen Unterordner liegen,
    die Zeile bei den es am Angang (da der restliche Zeileninhalt unterschiedlich sein kann) dies MS_MDLAPPS, MS_MDL oder MS_DGNAPPS steht löschen und im Anschluß Datei abspeichern?

    Beispiel:
    MS_MDLAPPS > C:/Programme/MicroStationV8/Workspace/standards/mdlapps/intelnt/
    MS_MDL > D:/prj/25808061/prcfg/mdl/
    MS_DGNAPPS > sscloud
    MS_MDL = C:/Programme/MicroStationV8/Program/MicroStation/FeatureModeling/features/
    MS_DGNAPPS > $(SR_ADMIN)user_config/$(_USTN_USERNAME)/sscloud.ma

    Besten Dank im Voraus !

    Viele Grüße,
    Dino

    Einmal editiert, zuletzt von Dino (17. November 2008 um 18:46)

    • Offizieller Beitrag

    Hi,
    so gehts in der einzelnen Datei. Du kannst ja alle Dateien vorher in ein Array einlesen und dann hiermit abarbeiten:

    Spoiler anzeigen
    [autoit]

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

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

    ;~ Local $arFile, $Path = 'Pfad'
    ;~ _FileReadToArray($Path, $arFile)
    ;~ If Not IsArray($arFile) Then Exit MsgBox(0, '', 'Datei konnte nicht gelesen werden.')

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

    ; ##### zum Test ######
    Local $arFile[9] = [8, _
    'MS_MDLAPPS > C:/Programme/MicroStationV8/Workspace/standards/mdlapps/intelnt/', _
    'MS_MDL > D:/prj/25808061/prcfg/mdl/', _
    'MS_DGNAPPS > sscloud', _
    'MS_MDL = C:/Programme/MicroStationV8/Program/MicroStation/FeatureModeling/features/', _
    'MS_DGNAPPS > $(SR_ADMIN)user_config/$(_USTN_USERNAME)/sscloud.ma', _
    'bjklllm', _
    'khglbhötji', _
    'MMMGGG']
    ; ######################

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

    For $i = 1 To UBound($arFile) -1
    If StringRegExp($arFile[$i], '(MS_)(MDL(APPS)?|DGNAPPS)') Then
    $arFile[$i] = ''
    $arFile[0] -= 1
    EndIf
    Next
    _Array2DEmptyDel($arFile)
    _ArrayDisplay($arFile)

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

    ;~ _FileWriteFromArray('Ausgabedatei', $arFile, 1)

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _Array2DEmptyDel(ByRef $avArray [, $Col=0])
    ;
    ; Description Delete empty Array elements
    ; Delete all emty Rows or all empty Columns
    ; Works also with 1D-Array (only Rows)
    ;
    ; Parameter $avArray Given Array
    ; optional $Col set 1 to delete empty Columns; default is 0 to delete empty Rows
    ;
    ; Return Succes 0 ByRef the given Array without empty Elements, resized
    ; Failure 1 and set @error = 1
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DEmptyDel(ByRef $avArray, $Col=0)
    If ( Not IsArray($avArray) ) Then Return SetError(1,0,1)
    Local $i, $k, $notEmpty
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    Local $arTMP[1]
    For $i = 0 To UBound($avArray)-1
    If StringLen($avArray[$i] > 0) Then
    If StringLen($arTMP[UBound($arTMP)-1]) = 0 Then
    $arTMP[UBound($arTMP)-1] = $avArray[$i]
    Else
    ReDim $arTMP[UBound($arTMP)+1]
    $arTMP[UBound($arTMP)-1] = $avArray[$i]
    EndIf
    EndIf
    Next
    Else
    If $Col = 0 Then
    Local $arTMP[1][$UBound2nd], $val, $len
    For $i = 0 To UBound($avArray)-1
    $val = ''
    For $k = 0 To $UBound2nd-1
    $val &= $avArray[$i][$k]
    Next
    If StringLen($val) > 0 Then
    $len = 0
    For $k = 0 To UBound($arTMP,2)-1
    $len &= StringLen($arTMP[UBound($arTMP)-1][$k])
    Next
    If $len = 0 Then
    For $k = 0 To $UBound2nd-1
    $arTMP[UBound($arTMP)-1][$k] = $avArray[$i][$k]
    Next
    Else
    ReDim $arTMP[UBound($arTMP)+1][$UBound2nd]
    For $k = 0 To $UBound2nd-1
    $arTMP[UBound($arTMP)-1][$k] = $avArray[$i][$k]
    Next
    EndIf
    EndIf
    Next
    Else
    Local $arTMP[UBound($avArray)][1], $val, $len
    For $k = 0 To $UBound2nd-1
    $val = ''
    $notEmpty = 0
    For $i = 0 To UBound($avArray)-1
    $val &= $avArray[$i][$k]
    If StringLen($val) > 0 Then
    $notEmpty = 1
    ExitLoop
    EndIf
    Next
    If $notEmpty = 1 Then
    $len = 0
    For $i = 0 To UBound($arTMP)-1
    $len &= StringLen($arTMP[$i][UBound($arTMP,2)-1])
    Next
    If $len = 0 Then
    For $i = 0 To UBound($avArray)-1
    $arTMP[$i][0] = $avArray[$i][$k]
    Next
    Else
    ReDim $arTMP[UBound($avArray)][UBound($arTMP,2)+1]
    For $i = 0 To UBound($avArray)-1
    $arTMP[$i][UBound($arTMP,2)-1] = $avArray[$i][$k]
    Next
    EndIf
    EndIf
    Next
    EndIf
    EndIf
    $avArray = $arTMP
    Return 0
    EndFunc ;==>_Array2DEmptyDel

    [/autoit]
  • Dieses Board heißt 'Hilfe und Unterstützung' und nicht 'Macht mir alles was ich brauche', aber ich will mal nicht so sein und dir eine weitere Hilfe geben.

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    #Include <Array.au3>
    #include "_Array2DEmptyDel.au3"

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

    $folder = FileSelectFolder("Ordner auswählen","c:\admin_V8\config\project_config\users\")

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

    If $folder = "" Then Exit
    $filesinpath = _FileListToArray($folder, "*.ucf",1)
    If $filesinpath = 0 Then Exit
    _ArrayDisplay($filesinpath)

    Local $aNewFile[UBound($filesinpath)], $count = 0, $aFile

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

    For $j = 1 To $filesinpath[0]
    _FileReadToArray($folder&"\"&$filesinpath[$j],$aFile)
    For $i = 1 To $aFile[0]
    If StringInStr($aFile[$i],"MS_MDLAPPS") Or StringInStr($aFile[$i],"MS_MDL") Or StringInStr($aFile[$i],"MS_DGNAPPS") Then ContinueLoop
    $aNewFile[$count] = $aFile[$i]
    $count += 1
    Next
    _Array2DEmptyDel($aNewFile)
    _FileWriteFromArray($folder&"\"&$filesinpath[$j],$aNewFile)
    $count = 0
    Next

    [/autoit]

    Durchsucht zwar nicht alle Ordner aber du kannst jeden Ordner einfach auswählen. Jetzt bist du mal gefragt, selber was zu leisten!

  • Hallo funkey,

    vielen Dank für die Hilfe !

    Ich bekomme beim Starten folgende Fehlermeldung:

    C:\Programme\AutoIt3\Include\sasa.au3(3,10) : ERROR: can't open include file "_Array2DEmptyDel.au3"
    #include "_Array2DEmptyDel.au3"
    ~~~~~~~~~^
    C:\Programme\AutoIt3\Include\sasa.au3(21,31) : ERROR: _Array2DEmptyDel(): undefined function.
    _Array2DEmptyDel($aNewFile)

    Gruß,
    Dino

    • Offizieller Beitrag

    Hi,
    es ist schon alles vorbereitet, du mußt die Teile nur zusammenfügen.

    Diese Lösung:

    [autoit]

    If StringInStr($aFile[$i],"MS_MDLAPPS") Or StringInStr($aFile[$i],"MS_MDL") Or StringInStr($aFile[$i],"MS_DGNAPPS") Then ContinueLoop

    [/autoit]

    ist nicht zu empfehlen, da sie der gestellten Bedingung nicht entspricht. Es wurde gesagt, dass nur wenn eine Zeile mit den benannten Begriffen beginnt, diese gelöscht werden soll. StringInStr() prüft nur auf Vorkommen irgendwo im String.
    Deshalb meine Variante:

    [autoit]

    If StringRegExp($arFile[$i], '(MS_)(MDL(APPS)?|DGNAPPS)') Then $arFile[$i] = ''

    [/autoit]
  • Hallo zusammen,

    jetzt habe ich es so:

    [autoit]

    #include <file.au3>
    #Include <Array.au3>
    #include "_Array2DEmptyDel.au3"

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

    $folder = FileSelectFolder("Ordner auswählen","c:\admin_V8\config\project_config\users\")

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

    If $folder = "" Then Exit
    $filesinpath = _FileListToArray($folder, "*.ucf",1)
    If $filesinpath = 0 Then Exit
    _ArrayDisplay($filesinpath)

    Local $aNewFile[UBound($filesinpath)], $count = 0, $aFile

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

    For $j = 1 To $filesinpath[0]
    _FileReadToArray($folder&"\"&$filesinpath[$j],$aFile)
    For $i = 1 To $aFile[0]
    If StringRegExp($arFile[$i], '(MS_)(MDL(APPS)?|DGNAPPS)') Then $arFile[$i] = ''
    $aNewFile[$count] = $aFile[$i]
    $count += 1
    Next
    _Array2DEmptyDel($aNewFile)
    _FileWriteFromArray($folder&"\"&$filesinpath[$j],$aNewFile)
    $count = 0
    Next

    [/autoit]

    Aber es wird nichts gelöscht :huh:

    • Offizieller Beitrag

    Was soll dieses Array NewFile nützen??

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    #Include <Array.au3>
    #include "_Array2DEmptyDel.au3"

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

    Local $folder, $filesinpath, $aFile
    While True
    $folder = FileSelectFolder("Ordner auswählen","c:\admin_V8\config\project_config\users\")
    If @error Then
    If MsgBox(262180,"Achtung!","Es wurde kein Ordner gewählt." & @CRLF & "Soll das Programm beendet werden?") = 6 Then Exit
    Else
    ExitLoop
    EndIf
    WEnd

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

    $filesinpath = _FileListToArray($folder, "*.ucf", 1)
    If @error Then Exit MsgBox(262192,"Achtung!","Der gewählte Ordner enthält keine Dateien!")
    ;~ _ArrayDisplay($filesinpath)

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

    Local

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

    For $i = 1 To UBound($filesinpath)
    If Not _FileReadToArray( $folder & "\" & $filesinpath[$i], $aFile) Then ContinueLoop
    For $k = 1 To UBound($aFile) -1
    If StringRegExp($aFile[$k], '(MS_)(MDL(APPS)?|DGNAPPS)') Then $aFile[$k] = ''
    Next
    _Array2DEmptyDel($aFile)
    _FileWriteFromArray($folder & "\clean_" & $filesinpath[$i], $aFile, 1)
    ; hab hier mal einen anderen Dateinamen verwendet um das Original nicht zu überschreiben
    Next

    [/autoit]
  • Hallo BugFix, hallo funkey,

    ich habe es wie folgt getestet:

    1.) bekomme diesen Error:
    C:\Dino\AutoIt3\FileWrite.au3(19,6) : ERROR: syntax error
    Local
    ~~~~~^
    C:\Dino\AutoIt3\FileWrite.au3 - 1 error(s), 0 warning(s)

    2.) die Originaldatei kann beschrieben werden. clean_ muss nicht erstellt werden

    3.) wie bekommt man es, dass auch die UPF-Dateien in allen Unterordner geändert werden?

    Besten Dank für Hilfe !

    Viele Grüße,
    Dino

    • Offizieller Beitrag

    "Local" in Zeile 19 kannst du löschen, ich hatte es vergessen als ich die Deklarationen an den Anfang verschoben hab ;)

    Um alle Unterordner ab Pfad zu durchsuchen, mußt du dir eine rekursive Filelist erstellen. Nutze mal die SuFu - dazu hab u. a. ich eine UDF erstellt.

  • Hallo BugFix,

    ich habe dein UDF gefunden, weiß aber nicht wie ich es einbinden soll. Könntest du mir bitte dabei helfen

    Anbei aktueller Code:

    [autoit]

    #include <file.au3>
    #Include <Array.au3>
    #include "_Array2DEmptyDel.au3"

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

    Local $folder, $filesinpath, $aFile
    While True
    $folder = FileSelectFolder("Ordner auswählen","c:\admin_V8\config\project_config\users\")
    If @error Then
    If MsgBox(262180,"Achtung!","Es wurde kein Ordner gewählt." & @CRLF & "Soll das Programm beendet werden?") = 6 Then Exit
    Else
    ExitLoop
    EndIf
    WEnd

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

    $filesinpath = _FileListToArray($folder, "*.ucf", 1)
    If @error Then Exit MsgBox(262192,"Achtung!","Der gewählte Ordner enthält keine Dateien!")

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

    For $i = 1 To UBound($filesinpath)
    If Not _FileReadToArray( $folder & "\" & $filesinpath[$i], $aFile) Then ContinueLoop
    For $k = 1 To UBound($aFile) -1
    If StringRegExp($aFile[$k], '(MS_)(MDL(APPS)?|DGNAPPS)') Then $aFile[$k] = ''
    Next
    _Array2DEmptyDel($aFile)
    _FileWriteFromArray($folder&"\"&$filesinpath[$i],$aFile, 1)
    Next

    [/autoit]


    Besten Dank !

    Gruß,
    Dino

    Einmal editiert, zuletzt von Dino (8. November 2008 um 09:35)

    • Offizieller Beitrag

    So,
    hab dir mal die Rekursion reingebaut:

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    #include "_Array2DEmptyDel.au3"

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

    Local $folder, $filesinpath, $aFile
    $folder = "c:\admin_V8\config\project_config\users\"
    $filesinpath = _GetFilesFolder_Rekursiv($folder, 'ucf', 0)
    If $filesinpath[0] = 0 Then Exit MsgBox(262192,"Achtung!","Der gewählte Ordner enthält keine Dateien!")

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

    For $i = 1 To UBound($filesinpath) -1
    If Not _FileReadToArray($filesinpath[$i], $aFile) Then ContinueLoop
    For $k = 1 To UBound($aFile) -1
    If StringRegExp($aFile[$k], '(MS_)(MDL(APPS)?|DGNAPPS)') Then $aFile[$k] = ''
    Next
    _Array2DEmptyDel($aFile)
    _FileWriteFromArray($filesinpath[$i], $aFile, 1)
    Next

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]