neve29
Goto Top

Text ersetzen mit Batch

Hallo zusammen,

ich frage mich ob folgendes per Batch möglich ist, da ich mich mit Perl rumschlage und es nicht auf die Kette bekomme:

Folgender Beispieltext innerhalb einer .txt im Beispielpfad C:/User/Test
Es sind immer mehrere Textdateien im Ordner vorhanden, welche identisch aufgebaut sind, jedoch inhaltlich unterschiedlich sind.
(XXXXX sind personenbezogene Daten)

Txt Datei 1:


Txt Datei 2:


Ich möchte gerne folgedes:

Das erste "null" soll IMMER bei jeder .txt ersetzt werden durch eine Zahl welche keine Abhängigkeit hat, zum Beispiel immer durch 200088.

Das zweite "null" soll ersetzt werden in Abhängigkeit durch ein bereits gefundenes Word - im ersten Fall GYN, im zweiten Fall CH1.


Es sind immer mehrere Textdateien im Ordner vorhanden, welche identisch aufgebaut sind, jedoch inhaltlich unterschiedlich sind.

Möglich ist auch die Schritte zu trennen und zwei Batch Dateien zu erstellen, welche kurz nacheinander laufen.


In Perl bekomme ich Schritt 1 programmiert, allerdings hänge ich bei Schritt 2.

Da die Batch später auf einem Server laufen soll wäre der weg über die CMD und Batch einfacher.

Danke ;)

Content-Key: 479144

Url: https://administrator.de/contentid/479144

Printed on: April 19, 2024 at 06:04 o'clock

Member: aqui
aqui Jul 30, 2019 updated at 07:42:19 (UTC)
Goto Top
Welches Betriebssystem ???
Da du von Perl redest ja sicher etwas Unixoides, oder ? Oder ist das egal ?
Member: NeVe29
NeVe29 Jul 30, 2019 at 07:44:21 (UTC)
Goto Top
Hi,

das Betriebssystem wo es ausgeführt wird ist Windows Server 2012.

Programmieren und testen damit es nicht die Produktivumgebung ist würde ich es gerne auf meinem Win 10.
Member: aqui
aqui Jul 30, 2019 updated at 07:48:11 (UTC)
Goto Top
Und warum dann nicht Power Shell ?? Wäre ja bei Winblows dann das Naheliegenste statt Perl. Aber egal. Einer der Batch Wizzards hier hat sicher ne Idee... face-wink
Member: NeVe29
NeVe29 Jul 30, 2019 at 07:49:56 (UTC)
Goto Top
Um ehrlich zu sein gerne auch per powershell.

Es muss nicht perl sein :D Die Frage ist jetzt mehr ins allgemeine gerutscht, da ich leider nicht DER Programmierer bin, aber es irgendwie lösen möchte ist mir jeder Weg dahin recht.
Member: SlainteMhath
SlainteMhath Jul 30, 2019 at 07:50:40 (UTC)
Goto Top
Moin,

Text ersetzen mit Batch
Der Betreff läuft gefühlt 2-3mal die Woche durch's Forum... Schon mal die hiesige Suchfunktion versucht?

lg,
Slainte
Mitglied: 140447
140447 Jul 30, 2019 updated at 07:59:22 (UTC)
Goto Top
Um ehrlich zu sein gerne auch per powershell.
Get-ChildItem "D:\Ordner" -File -Filter *.txt | %{  
    $csv = Import-CSV $_.Fullname -Delimiter "|" -Header (1..15)  
    $csv.11 = "200088"  
    $csv.13 = $csv.'4'.split(" ")  
    ($csv | convertto-csv -Delimiter "|" -NoTypeInformation | select -skip 1) -replace '"','' | sc $_.Fullname  
}
Member: NeVe29
NeVe29 Jul 30, 2019 at 07:55:07 (UTC)
Goto Top
Ja, allerdings finde ich keine Lösung zu meinem zweiten anliegen, welche damit zusammenhängt.
Mitglied: 140447
140447 Jul 30, 2019 updated at 08:45:03 (UTC)
Goto Top
Zitat von @NeVe29:

Ja, allerdings finde ich keine Lösung zu meinem zweiten anliegen, welche damit zusammenhängt.
s.o. "All in One"
Member: NeVe29
NeVe29 Jul 30, 2019 at 09:08:26 (UTC)
Goto Top
Boah super danke dir face-smile

Hat allerdings nicht geklappt, kann aber auch an meiner unwissenheit liegen.

Ich hab das ding jetzt in in eine .txt eingefügt, den Pfad angepasst und als batch gespeichert. Nach dem ausführen passiert garnichts.

Auch wenn ich den Code im Powershell ausführe passiert nichts. Kann mir da noch jemand helfen? Muss ich noch etwas ersetzen?
Mitglied: 140447
Solution 140447 Jul 30, 2019 updated at 09:13:14 (UTC)
Goto Top
Zitat von @NeVe29:
Hat allerdings nicht geklappt, kann aber auch an meiner unwissenheit liegen.
Doch hier natürlich getestet. Btw. es wird nichts ausgegeben sondern nur die bestehenden Dateien verändert.
Ich hab das ding jetzt in in eine .txt eingefügt, den Pfad angepasst und als batch gespeichert. Nach dem ausführen passiert garnichts.
Was steht wohl drüber Powershell!

Auch wenn ich den Code im Powershell ausführe passiert nichts. Kann mir da noch jemand helfen? Muss ich noch etwas ersetzen?
Den Pfad in dem die Dateien liegen
Als Anfänger erst mal Grundlagen lesen:
https://www.windowspro.de/andreas-kroschel/powershell-scripts-ausfuehren
Member: NeVe29
NeVe29 Jul 30, 2019 at 12:16:35 (UTC)
Goto Top
Sehr gut.
Danke dir face-smile

Das Problem lag zusätzlich daran dass die Datei eine .dat ist und keine .txt

Jetzt hab ich es allerdings umgebaut sodass erstmal alle .dat in .txt umgewandelt werden, das Script angewendet wird, und dann wieder alles in .dat benannt wird, um vom zuständigen Programm weiter verarbeitet zu werden.

Der Code sieht nun wie folgt aus:

Get-childItem "C:\Users\gemuendadm\Desktop\PGTEST123" -recurse | Where {$_.extension -eq ".dat"} | rename-item -newname { $_.name -replace ".dat",".txt" };
Get-ChildItem "C:\Users\gemuendadm\Desktop\PGTEST123" -File -Filter *.txt | %{
$csv = Import-CSV $_.Fullname -Delimiter "|" -Header (1..15)
$csv.11 = "0003999998"
$csv.13 = $csv.'4'.split(" ")
($csv | convertto-csv -Delimiter "|" -NoTypeInformation | select -skip 1) -replace '"','' | sc $_.Fullname
};
Get-childItem "C:\Users\gemuendadm\Desktop\PGTEST123" -recurse | Where {$_.extension -eq ".txt"} | rename-item -newname { $_.name -replace ".txt",".dat" };

Geht das auch einfacher? Das funktioniert so, allerdings lässt mich das gefühl nicht los dass es einfacher geht
Mitglied: 140447
Solution 140447 Jul 30, 2019 updated at 12:39:14 (UTC)
Goto Top
Das Problem lag zusätzlich daran dass die Datei eine .dat ist und keine .txt
Nein, ob dat oder txt ist wurscht Hauptsache beide haben Textinhalt, die Endung verändert nicht das Verhalten! Vorheriges Umbenennen ist unnötig! Einfach die Extension Includen fertsch.
Get-ChildItem "C:\Users\gemuendadm\Desktop\PGTEST123\*" -File -Include *.txt,*.dat | %{  
    $csv = Import-CSV $_.Fullname -Delimiter "|" -Header (1..15)  
    $csv.11 = "200088"  
    $csv.13 = $csv.'4'.split(" ")  
    ($csv | convertto-csv -Delimiter "|" -NoTypeInformation | select -skip 1) -replace '"','' | sc -Path ($_.Fullname -replace "\.txt$",".dat")  
    if ($_.Extension -eq ".txt"){del $_.Fullname -Force}  
}
Member: NeVe29
NeVe29 Jul 30, 2019 at 13:07:00 (UTC)
Goto Top
Auch wenns dir nichts bringt und meine Unwissenheit dich nervt, DANKE!!!
Bist mein Held :D

Jetzt hab ich gesehen das der Inhalt der Dateien nach dem Ausführen des Scripts aus einem ü ein ?macht.

Meine Idee wäre jetzt einen weiteren Befehl hinzuzufügen welcher aus allen "?" wieder ein "ü" macht.

Ist das Sinnvoll oder gibt es eine andere Methode? Habe Codes gefunden und rumprobiert, komme aber erneut nicht auf einen Nenner.
Member: NeVe29
NeVe29 Jul 30, 2019 at 13:21:16 (UTC)
Goto Top
Hat sich erledigt :D Danke nochmal face-smile
Member: NeVe29
NeVe29 Jul 30, 2019 at 13:53:10 (UTC)
Goto Top
Okay, nicht erledigt.

Ich hab herausgefunden dass was mti der Codierung nicht okay ist. Klingt auch einleuchtend.

Ich hab jetzt nachgeschaut ob ich die Codierung ändern kann oder ob es an der Powershell Version liegt.

Was soll ich sagen... wiedermal mit meinem Latein am Ende....
Mitglied: 140447
Solution 140447 Jul 30, 2019 updated at 15:00:42 (UTC)
Goto Top
Bei Import-CSV die Kodierung festlegen, Parameter -Encoding und dann entsprechend dem Encoding "Default" oder UTF8 usw. festlegen!
Member: NeVe29
NeVe29 Aug 01, 2019 at 08:43:52 (UTC)
Goto Top
Hab ich dann auch geschafft und ein neue "Problem" hat sich bemerkbar gemacht.

Nach der Ausgabe ist im Inhalt der Datei ein Zeilenumbruch zu erkennen. Der muss aber weg.

Laut recherche ist dafür aber doch -replace '"','' zuständig oder etwa nicht?
Mitglied: 140447
140447 Aug 01, 2019 updated at 08:52:22 (UTC)
Goto Top
Zitat von @NeVe29:
Nach der Ausgabe ist im Inhalt der Datei ein Zeilenumbruch zu erkennen. Der muss aber weg.
Das ist normal mit den CMDLets werden immer komplete Zeilen geschrieben, willst du das nicht, benutze statt Set-Content die NET-Funktion IO.File WriteAllText, die setzt keinen automatischen Umbruch.
[IO.File]::WriteAllText("C:\Pfad\datei.csv","Inhalt")  
Laut recherche ist dafür aber doch -replace '"','' zuständig oder etwa nicht?
Nein, das eliminiert nur die Anführungszeichen mit der per Default alle Daten eingeschlossen sind.