Alle Dateien öffnen

  • Guten Tag,

    ich habe ein Problem, bin derzeit auf der Arbeit habe deshalb auch keinen Code zur verfügung.
    Deswegen die Frage etwas unverschämt, ich müsste .XML daten ändern, bzw bestimmte Zeilen (bzw. Begriffe) müssten geändert werden.
    Als Beispiel, in der XML nach A suchen (nur ganze wörter) - und durch AB ersetzen, dann die XML neu speichern.
    Das wäre alles, weis leider nicht wie ich das bewerkstellige.
    Ich hoffe es gibt eine Lösung!
    Verzeihung, dass ich keinen Code zur verfügung habe!

    Edit: Soweit habe ich das Prob. gelöst aber nur für EINE Datei, ALLE Endungen sollen geändert werden.

    Script:

    [autoit]

    #Include <File.au3>

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

    for $i=0 To _FileCountLines("test.xml")
    $text=FileReadLine("test.xml",$i)
    If StringInStr($text,"<Land><![CDATA[F]]></Land>")<>0 then
    _FileWriteToLine("test.xml",$i,"<Land><![CDATA[FR]]></Land>",1)
    elseif StringInStr($text,"<LLand><![CDATA[F]]></LLand>")<>0 then
    _FileWriteToLine("test.xml",$i,"<LLand><![CDATA[FR]]></LLand>",1)
    EndIf
    Next

    [/autoit]

    3 Mal editiert, zuletzt von vism (9. Juli 2012 um 11:14)

  • Einfach dein destination folder die Dateien auslesen mit

    [autoit]

    local $srcFileList = _FileListToArray()

    [/autoit]

    und dann mit

    [autoit]

    For $elements In $srcFileList
    deine Funktion....
    Next

    [/autoit]

    ich hoffe Dein Problem richtig verstanden zu haben

    EDIT: ach ja in der For-Schleife musst Du jeweils den Pfad kompletieren um die Datei zu öffnen

    [autoit]

    $path = ("C:\" & $elements)
    $File = FileOpen($path)

    [/autoit]

    u.s.w.


  • Danke schon mal für die Antwort, muss ich da jetzt noch was bestimmtes festlegen?
    Hättest du eventuell einen Beispielcode?, - mir geht es darum, (um die Frage etwas zu konkretisieren) dass ich bspw. 20 .xml Dateien habe, alle einen anderen Namen, in jeder dieser Dateien müssen bestimmte Wörter geändert werden, dies soll in allen XML-Daten erfolgen.
    Wäre es zu dreist nach einem Code zu fragen? =/

  • Ja sehr dreist :-)... Spaß

    [autoit]

    #include <File.au3>
    local $srcFileList = _FileListToArray("Dein Pfad", "*.xml", 1)
    For $elements In $srcFileList
    $File = FileOpen("Dein Pfad" & $elements , 1)
    FileSetPos($File,0,0)
    for $i = 0 To _FileCountLines("test.xml")
    $text = FileReadLine($File $i)
    If StringInStr($text, "<Land><![CDATA[F]]></Land>") <> 0 then
    _FileWriteToLine($File, $i, "<Land><![CDATA[FR]]></Land>", 1)
    elseif StringInStr($text, "<LLand><![CDATA[F]]></LLand>") <> 0 then
    _FileWriteToLine($File, $i, "<LLand><![CDATA[FR]]></LLand>", 1)
    EndIf
    Next
    FileClose($File)
    Next

    [/autoit]

    NICHT GETESTET! "Dein Pfad" kann auch aus einem Control kommen, z.B. ein input Feld

    Habe Dein Code für das ersetzen genommen... geht auch anders, aber müsste auch so Funktionieren

  • Spoiler anzeigen
    [autoit]

    #include <File.au3>

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

    Global Const $s_Path = @MyDocumentsDir
    ; Ordner, in dem sich die XML-Dateien befinden (ohne Backslash)

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

    Global Const $a_List = _FileListToArray ($s_Path, '*', 1)
    ; Hier wird ein Array mit allen Dateinamen erstellt

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

    Global $a_Line

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

    For $j = 0 To $a_List[0]
    If StringRight ($a_List[$j], 4) <> ".xml" Then ContinueLoop

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

    $a_Split = StringSplit (FileRead ($s_Path & "\" & $a_List[$j]), @CRLF, 1)
    ; Es ist besser den Inhalt der Datei an den Zeilenumbrüchen zu splitten,
    ; weil man dann die Datei nicht immer wieder auslesen muss. +Geschwindigkeit

    For $i = 1 To $a_Line[0]
    If StringInStr ($a_Line[$i], "<Land><![CDATA[F]]></Land>") Then
    _FileWriteToLine ($s_Path & "\" & $a_List[$j], $i, "<Land><![CDATA[FR]]></Land>", 1)
    ElseIf StringInStr ($a_Line[$i], "<LLand><![CDATA[F]]></LLand>") Then
    _FileWriteToLine ($s_Path & "\" & $a_List[$j], $i, "<LLand><![CDATA[FR]]></LLand>", 1)
    EndIf
    Next
    Next

    [/autoit]

    €: Und wieder bin ich so spät... :pinch:

  • Danke dafür,
    nunja folgendes:

    [autoit]

    $text = FileReadLine($File $i)
    $text = FileReadLine(^ ERROR

    [/autoit]


    - aber = da steht ja auch,

    [autoit]

    for $i = 0 To _FileCountLines("test.xml")

    [/autoit]


    bedeutet das nun, dass ich auch nur auf eine XML anwenden kann wenn diese nun so heißt? Oder fehlte da nun was?
    Sorry habe noch nie mit diesem FileRead gearbeitet bzw CountLines etc. =(

    Edit: - Danke auch an $var, bei deiner Lösung bekommen ich

    [autoit]

    If StringRight ($a_List[$i], 4) <> ".xml" Then ContinueLoop
    If StringRight ($a_List[^ ERROR

    [/autoit]


    Fehlen mir nun Includes? =/ Oder woran liegt das?

  • Fehler von mir bitte folgendes ändern:

    [autoit]

    for $i = 0 To _FileCountLines("test.xml")

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

    nach

    [autoit]

    for $i = 0 To _FileCountLines($File)

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

    und natürlich bei

    [autoit]

    $text = FileReadLine($File, $i)

    [/autoit]

    komma nicht vergessen :)

  • Nun gut hab das jetzt so:

    [autoit]

    #include <File.au3>

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

    local $srcFileList = _FileListToArray("Dein Pfad", "*.xml", 1)
    For $elements In $srcFileList
    $File = FileOpen("Dein Pfad" & $elements , 1)
    FileSetPos($File,0,0)
    for $i = 0 To _FileCountLines($File)
    $text = FileReadLine($File, $i)
    If StringInStr($text, "<Land><![CDATA[F]]></Land>") <> 0 then
    _FileWriteToLine($File, $i, "<Land><![CDATA[FR]]></Land>", 1)
    elseif StringInStr($text, "<LLand><![CDATA[F]]></LLand>") <> 0 then
    _FileWriteToLine($File, $i, "<LLand><![CDATA[FR]]></LLand>", 1)
    EndIf
    Next
    FileClose($File)
    Next

    [/autoit]

    und natürlich stimmt noch immer etwas nicht, -

    [autoit]

    For $elements In $srcFileList
    For $elements In $srcFileList^ ERROR

    [/autoit]


    habe momentan auch dermaßen Kopfschmerzen, das ich solche Dinge wie das Komma, nicht sehe, bzw den Fehler nicht sehe, sorry.
    Ziemlich viel Stress auf der Arbeit heut. =/

    EDIT: Sorry, Pfad vergessen, nun gibt es keinen Fehler aber die Zeile wird nicht geändert, das F wird nicht durch FR ersetzt =/

  • Na ja die For-Schleife sollte schon so aussehen :)

    [autoit]

    for $i=0 To _FileCountLines($File) Step -1

    [/autoit]

    und der Ordner darf natürlich nicht leer sein, deshalb könnte mannoch folgende Abfrage noch einbauen:

    [autoit]

    #include <File.au3>
    #include <Array.au3>
    local $i = 0
    local $srcFileList = _FileListToArray("C:\", "*.xml", 1)
    If UBound($srcFileList) <> 0 Then ;prüfen ob Array nicht leer ist
    _ArrayDelete($srcFileList,0) ;0te Element beinhaltet die Aazhl der Dateien
    For $elements In $srcFileList
    $File = FileOpen("C:\" & $elements, 1)
    FileSetPos($File, 0, 0)
    for $i = 0 To _FileCountLines($File) Step -1
    $text = FileReadLine($File, $i)
    If StringInStr($text, "<Land><![CDATA[F]]></Land>") <> 0 then
    _FileWriteToLine($File, $i, "<Land><![CDATA[FR]]></Land>", 1)
    elseif StringInStr($text, "<LLand><![CDATA[F]]></LLand>") <> 0 then
    _FileWriteToLine($File, $i, "<LLand><![CDATA[FR]]></LLand>", 1)
    EndIf
    Next
    FileClose($File)

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

    Next
    EndIf

    [/autoit]

    habe leider kein Autoit auf dem Firmenrechner :)

  • Verständlich, alle auf der Arbeit aber am surfen. :D - Also - keine Fehler etc. aber auch keine Änderung habs mal nur mit C:\ versucht, auch in dem Fall keine Änderung innerhalb der XML, also als einzel ging es, wie oben bei meinem ursprünglichen Code, aber wenn ich mehrere ändern möchte, tut sich leider nichts. =(

  • :D bei der For schleife muss man 1 und nicht -1 einztragen, es soll ja hochgezählt werden

    weiterhin benötigen einige Funktionen die Dateireferenz und andere den dateipfad. So geht es:

    [autoit]


    #include <File.au3>
    #include <Array.au3>
    local $i = 0
    local $srcFileList = _FileListToArray("C:\", "*.xml", 1)
    _ArrayDelete($srcFileList,0) ;0te Element beinhaltet die Aazhl der Dateien
    If UBound($srcFileList) <> 0 Then ;prüfen ob Array nicht leer ist

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

    For $elements In $srcFileList
    $path = "C:\" & $elements
    $File = FileOpen($path, 1)
    FileSetPos($File, 0, 0)
    For $i = 0 To _FileCountLines($path) Step 1
    $text = FileReadLine($File)
    If StringInStr($text, "<Land><![CDATA[F]]></Land>") > 0 then
    _FileWriteToLine($path, $i, "<Land><![CDATA[FR]]></Land>", 1)
    ElseIf StringInStr($text, "<LLand><![CDATA[F]]></Land>") > 0 then
    _FileWriteToLine($path, $i, "<Land><![CDATA[FR]]></Land>", 1)
    EndIf
    Next
    FileClose($File)

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

    Next
    EndIf

    [/autoit]

    3 Mal editiert, zuletzt von Protaris (9. Juli 2012 um 17:11)


  • Es passiert endlich das, was passieren soll, Problem jetzt aber, das ganze Zeilen entfernt werden, also wenn bspw. etwas vor der zu suchenden Wortkonstellation steht, wird das mit entfernt, also die ganze Zeile, kann man das nicht so machen, dass nur die Passage entfernt wird? Am Anfang, also das Ursprungsscript, - dort klappte das, hier sieht es ja eigentlich unten (optisch) nicht anders aus, aber klappen tut es nicht. =( Ich verzweifele noch! X(

  • [Sorry für Doppelpost]
    Leider ist es nun so, (ich teste gerade), dass die XML-Datein zwar verändert werden aber nicht vollständig, insgesammt müssten 10 Änderungen vorgenommen werden, also diese beiden Werte, die geändert werden müssen existieren zusammen genommen, 10 mal - in jeder Datei.
    Der Rest sollte eigentlich soweit klappen, lediglich eine Schleife müsste gemacht werden, bzw. jede Datei müsste öfter geändert werden, kann ich das loopen?