springstil
Goto Top

Powershell Skript erweitern

Hallo zusammen,

ich brauch bitte eure Hilfe.

Ein User hier im Board hatte mit dieses Skript geschrieben:

$configfile = "D:\config.txt"  
$quelle = "D:\quelle"  
$ziel = 'D:\ziel'  
# ---------------
$config = gc $configfile -raw | ConvertFrom-StringData

ls $quelle -File -PipelineVariable file | %{
    [regex]::Replace((gc $_.FullName -raw),'(?ism)^5002[^\s]*\s*\d+\s*\d+\s*(\d+)[^\r\n]*'',{  
        param($m)
        if ($config.ContainsKey($m.Groups[1].Value)){
            $rahmenNr = $config.($m.Groups[1].Value)
            $m.Value -replace "(?<=^.{55}).{$($rahmenNr.length)}",$rahmenNr  
        }else{$m.Value}
    }) | sc "$ziel\$($file.Name)"  
}

das dient dazu an einer Bestimmten Stelle etwas rein zu schreiben wenn eine Zeichenfolge eintritt.

Die komplette zeile sieht so aus:

500220BX0ML                    2020122920210129                                      4003529000007             9007019001586                                                                                                                                       90070190000089007019001586             XXXXXX                                                                                                                                                                                                                               


Config Datei sieht immer so aus:

9007019001586  = 12345
9007045685586 = 67890 
Nun geht es in dem Skript darum, wenn zb an der stelle 112 - 125 9007019001586 auftaucht, er an der Stelle 54 in dieser Datei einen wert eintragen soll. Das läuft soweit auch super.

Nun ist es aber so, das ich das Skript erweitern muss.... Wenn er an der Stelle 112-125 nichts erkennt, somit auch nicht an die Stelle 55 etwas geschrieben hat, muss er an der stelle 273 - 286 danach suchen und ggf. an der 55 die zahl rein schreiben.

Es handelt sich hierbei um eine EDI Datei. Diese Datei hat IMMER das selbe Format. Alle Leerzeichen sind immer an der selben stelle. und der gesamte Aufbau ist der gleiche. Nur die werte ändern sich darin.


Ich bin nicht sehr gut im Skripten da ich nicht immer genau verstehe wieso das so sein muss. Natürlich kann ich mich da jetzt rein lesen (was ich bereits getan habe) und versuchen das selbst zu lösen. Allerdings fehlt mir hierzu die Zeit. Vor etwa 4 Wochen ist unsere Firmen Zentrale abgebrannt... (Google: Großbrand Köln Lind) Nun gibt es logischerweise extrem viel zu tun um einiges in den neuen Büros und Lägern wieder lauffähig zu bekommen.

Wenn mir also jemand helfen kann, würde ich auch gern eine kleine Spende über Paypal senden.

Content-ID: 636529

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

Ausgedruckt am: 21.11.2024 um 19:11 Uhr

mayho33
mayho33 31.12.2020 um 02:31:38 Uhr
Goto Top
Zitat von @Springstil:

Hallo zusammen,
ich brauch bitte eure Hilfe.

Hi! Ok!

Nun geht es in dem Skript darum, wenn zb an der stelle 112 - 125 9007019001586 auftaucht, er an der Stelle 54 in dieser Datei einen wert eintragen soll. Das läuft soweit auch super.


Mit Stelle ist eine Zeile gemeint oder eine Spalte (jedes Zeichen repräsentiert eine Spalte)?

Nun ist es aber so, das ich das Skript erweitern muss.... Wenn er an der Stelle 112-125 nichts erkennt, somit auch nicht an die Stelle 55 etwas geschrieben hat, muss er an der stelle 273 - 286 danach suchen und ggf. an der 55 die zahl rein schreiben.

Wenn ich also davon ausgehe, dass du Zeilen meinst, dann soll in 2 Bereichen der Config nach einem Vorkommen gesucht und in einer anderen Zeile dieses Vorkommen geschrieben werden?

Es handelt sich hierbei um eine EDI Datei. Diese Datei hat IMMER das selbe Format. Alle Leerzeichen sind immer an der selben stelle. und der gesamte Aufbau ist der gleiche. Nur die werte ändern sich darin.

Kannst du mal eine dieser EDI-Dateien (vollständig) posten oder ist die geheim?

Ich bin nicht sehr gut im Skripten

Kein Problem! Aber wir wurden schon genaue Angaben brauchen um helfen zu können.

Grüße!
Springstil
Springstil 31.12.2020 um 13:06:18 Uhr
Goto Top
Zitat von @mayho33:

Zitat von @Springstil:

Mit Stelle ist eine Zeile gemeint oder eine Spalte (jedes Zeichen repräsentiert eine Spalte)?

Jedes Zeichen ist eine Spalte face-smile Also Position in der ersten Zeile


Wenn ich also davon ausgehe, dass du Zeilen meinst, dann soll in 2 Bereichen der Config nach einem Vorkommen gesucht und in einer anderen Zeile dieses Vorkommen geschrieben werden?

Genau erst fragt das Skript relativ am Anfang ab ob dort das gleiche drin steht wie in der Config. Wenn ja Schreibt er aus der Config den Wert an Position 55 (muss aber dringend die Leerzeichen überschreiben. Denn an den Positionen darf sich nichts ändern. Die breite muss also immer gleich bleiben.


Kannst du mal eine dieser EDI-Dateien (vollständig) posten oder ist die geheim?

https://my.hidrive.com/lnk/TTCoDSGs
Dort stehen auch Privat Leute Adressen drin. Das hab ich mal rausgenommen da sie später kommt. In Zeile 1 Spielt sich quasi alles ab.
Habe das mal hochgeladen, da es sonst schwer ist im Original da zustellen.


Kein Problem! Aber wir wurden schon genaue Angaben brauchen um helfen zu können.

Hoffe das erklärt so etwas mehr face-smile
147069
Lösung 147069 01.01.2021 aktualisiert um 12:37:41 Uhr
Goto Top
$configfile = "D:\config.txt"  
$quelle = "D:\quelle"  
$ziel = 'D:\ziel'  
# ---------------
$config = gc $configfile -raw | ConvertFrom-StringData

ls $quelle -File -PipelineVariable file | %{
    [regex]::Replace((gc $_.FullName -raw),'(?ism)^5002[^\s]*\s*\d+\s*\d+\s*(\d+)\s*\d{13}(\d+)[^\r\n]*',{  
        param($m)
        if ($config.ContainsKey($m.Groups[1].Value)){
            $rahmenNr = $config.($m.Groups[1].Value)
            $m.Value -replace "(?<=^.{55}).{$($rahmenNr.length)}",$rahmenNr  
        }elseif($config.ContainsKey($m.Groups[2].Value)){
            $rahmenNr = $config.($m.Groups[2].Value)
            $m.Value -replace "(?<=^.{55}).{$($rahmenNr.length)}",$rahmenNr  
        }else{$m.Value}
    }) | sc "$ziel\$($file.Name)"  
}

n' guts 🎆 2021
Springstil
Springstil 01.01.2021 um 12:48:32 Uhr
Goto Top
Vielen dank für die Skript Anpassung face-smile Das scheint super zu klappen im ersten Test.

Kannst du mir das vielleicht mal versuchen zu erklären? So ganz check ich das gerade nicht :X

Und wünsch euch auch ein Gutes und Gesundes Neues Jahr!
147069
147069 01.01.2021 aktualisiert um 12:57:02 Uhr
Goto Top
Regular Expressions hier jetzt im einzelnen zu erklären würde Tage dauern ...
Belies dich einfach hier, dann verstehst du auch was da passiert -> Reguläre Ausdrücke

Viel Erfolg beim Neuaufbau!
Springstil
Springstil 01.01.2021 um 13:24:48 Uhr
Goto Top
Die Regular Expressions versteh ich. zumindest was diese machen. Nur Verstehe ich nicht, warum er erst "vorne" schaut und wenn er da nichts findet weiter hinten noch einmal. Das ist doch quasi alles in einer zeile geschrieben die Regular Expressions.

Also wie kann er 2 mal darauf zugreifen obwohl es ein befehl ist
147069
147069 01.01.2021 aktualisiert um 13:37:14 Uhr
Goto Top
Zitat von @Springstil:

Die Regular Expressions versteh ich. zumindest was diese machen. Nur Verstehe ich nicht, warum er erst "vorne" schaut und wenn er da nichts findet weiter hinten noch einmal. Das ist doch quasi alles in einer zeile geschrieben die Regular Expressions.

Also wie kann er 2 mal darauf zugreifen obwohl es ein befehl ist
Der Regex verweist auf zwei Submatches (1 und 2, die mit Klammern im Regex versehen sind). Dieser Regex wird dann durch die Funktion in den geschweiften Klammern {} des Regex-Replace-Itterators verarbeitet. Dieser wird für jede Zeile die auf den der Regex zutrifft aufgerufen Dort ist der Match in der Variablen $m enthalten. Auf die Submatches greift man so zu: $m.Groups[n].Value
Innerhalb der Funktion gibt es nun eine IF-ELSE Abfrage welche prüft ob es ein Match mit dem ersten und wenn nicht (elseif Teil) mit dem zweiten Submatch gibt, wenn ja dann wird in der Zeile jeweils die Info aus der config Datei eingesetzt und ausgegeben. Gibt es für beide kein Match wird die Zeile so wie sie ist übernommen.