Benutzer mit den meisten Antworten
Datei durchsuchen und an bestimmten Stellen etwas hinzufügen

Frage
-
Hallo zusammen,
ich habe ein großes Problem zu lösen, daher wende ich mich direkt an das Board in der Hoffnung das mir jemand helfen kann.
Ich würde gerne mit Hilfe von Powershell eine EDI Datei bearbeiten. Diese ist nichts anderes als eine Textdatei mit vordefinierten spalten und Zeilen.
Die Zeile die ich bearbeiten will beginnt immer mit 119IV gefolgt von einem leerzeichen und einer 13 stelligen Zahl (beginnt an stelle 7 bis 13)
nun möchte ich in dieser Zeile, abhängig von der GLN (zeichen 7-13) an der stelle 347 bis 381 (zeichen) eine UID Nummer eintragen, die sich danach danach richtet wie die GLN (zeichen 7-13 in der selben Zeile) war. Eine Liste dafür habe ich.
Ich hoffe ich konnte es verständlich erklären :)
Fals die frage aufkommt warum ich das so dringend brauche, es geht darum das wir unsere Warenwirtschaft umstellen. Die Alte wird nicht mehr Programmiert bzw weiter entwickelt. Demen sprechend kann ich die Anpassung um es direkt einzufügen nicht machen. Ich plage mich mit dem Problem schon seit 2 Monaten rum, und seit 4 Monaten konnte der Kunde noch keine Rechnung bezahlen.. Daher eilt es etwas :/ Durch Corona ist ziemlich viel durch einander gekommen... Daher hoffe ich jetzt hier auf hilfe :)
Antworten
-
Ich hab mir versucht was zusammen zu googeln, allerdings bin ich kläglich gescheitert...
Hmmm. Ich denke da an
- Import-CSV (um Deine GLN- zu UID-Umwandlungsliste einzulesen)
- Get-Content (um die EDI einzulesen)
- foreach - Schleife
- .Substring() (um die GLN-Nummer rauszusuchen
- Strings zusammenfügen
- Add-Content (für die Ausgabe)
Sollte doch ohne größere Probleme gehen?
Evgenij Smirnov
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:03
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:05
Alle Antworten
-
Daher hoffe ich jetzt hier auf hilfe :)
Evgenij Smirnov
-
Ich hab mir versucht was zusammen zu googeln, allerdings bin ich kläglich gescheitert... Hab ein paar versuche unternommen aber nichts hat richtig geklappt.
Beispiel einer EDI Datei ist etwas schwierig :P
119IV GLNXXXXXXXXX namederfirma straßeusw XXXXX XXXXX X CZ XXXXXX
Aber hier ist noch die Beschreibung der Satzart 119
https://prnt.sc/u4zb28 darf es als bild leider noch nicht einfügen
-
darf es als bild leider noch nicht einfügen
Evgenij Smirnov
-
Ich hab mir versucht was zusammen zu googeln, allerdings bin ich kläglich gescheitert...
Hmmm. Ich denke da an
- Import-CSV (um Deine GLN- zu UID-Umwandlungsliste einzulesen)
- Get-Content (um die EDI einzulesen)
- foreach - Schleife
- .Substring() (um die GLN-Nummer rauszusuchen
- Strings zusammenfügen
- Add-Content (für die Ausgabe)
Sollte doch ohne größere Probleme gehen?
Evgenij Smirnov
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:03
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:05
-
Hmmm. Ich denke da an
- Import-CSV (um Deine GLN- zu UID-Umwandlungsliste einzulesen)
- Get-Content (um die EDI einzulesen)
- foreach - Schleife
- .Substring() (um die GLN-Nummer rauszusuchen
- Strings zusammenfügen
- Add-Content (für die Ausgabe)
Sollte doch ohne größere Probleme gehen?
Hört sich ziemlich einfach an. Allerdings hab ich nicht so viel plan von Powershell. Hab zwar ein paar Scripte mit Powershell gemacht wie Backup vom SQL und sichern, oder für den Domain Controller benutzer verwaltung.. aber ich erlese mir meist die stellen die die ich brauche und füge mir das alles so aus schnipseln zusammen.
Kannst du mir das vielleicht etwas genauer erklären ? ggf gegen einen Obolus sowas als Skript schreiben ? Mir läuft halt einfach die zeit grade davon. Das ist das größte problem was ich habe
-
Leider funktioniert das mit EDI nicht so einfach, da die GLN-Nummer nicht eindeutig erkennbar ist.
Hier muss die Satzart mit berücksichtigt werden, andernfalls könnte man auch Teilenummern oder was anderes erwischen.
Allerdings kannst du per den String des per "Get-Content" ausgelesenen Inhalts per strin split mit Hochkoma in Zeilen zerlegen.
Per foreach suchst du die Satzarten, die den GLN enthalten und kannst darauf den Replace anwenden.
Per String Join mit Hochkomma fügst du das ganze wieder zusammen und gibst es wieder in eine Datei aus. -
Ich verstehe halt absolut nicht wie ich das sonst teilen und wieder zusammen fügen sollte
Oh, Mann. Die Felder sind doch fix, wie damals in den 80ern (kein Wunder beim EDI-Format ;-) ).
$a = "0123456789abcdefghijklmnopqrstuvwxyz" $b = $a.Substring(0,5) $c = $a.Substring(5,5) $d = $a.Substring(10,23) $e = $a.Substring(33,($a.Length - 33)) $d_neu = "ick bin 23 zeichen lang" $a_neu = $b + $c + $d_neu + $e
:-)
Evgenij Smirnov
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:03
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:04
- Tag als Antwort aufgehoben Denniver ReiningMVP, Moderator Samstag, 29. August 2020 00:05
-
Wemnn es wirklich EDI ist, dann sieht das bei mir so aus:
UNA:+.? 'UNB+UNOC:3+4061973000004:14+2005218:14+060720:1535+1'UNH+1+DESADV:D:96B:UN:ITEK35'BGM+351+100000507430057958'DTM+11:20200618:102'RFF+VN:4027338102'DTM+4:20200618:102'NAD+WS+4046137162002.........UNS+S'UNT+97+1'UNZ+1+1'
Und irgendwo da stehen dann die GLN-Nummern.
Wie zu sehen ist, endet jede Zeile mit einem Hochkomma.Das Format ist i.Ü. überhaupt nicht fest und bedarf einer ausführlichen Interpreatation.
-
Okay das hab ich verstanden. Reicht es nicht in meinem falle:
$a = "0123456789abcdefghijklmnopqrstuvwxyz" $b = $a.Substring(6,18)
Dann habe ich als $b ja quasi schon mal die GLN denn die beginnt ja in zeichen 7.
mit $b muss ich jetzt aber abfragen wo es sich in der CSV z.b befindet. Wie stell ich das an ?
vorallem stellt sich mir aber die frage wie ich das immer dann anwende wenn vorner weg 119IV steht.
-
Nun denn, wer genug Geld hat...
Du kannst deine Datei auch mit
$Inhalt = Get-Content
in eine Variable einlesen. Diese ist dann vom Typ "String".
nun kannst du mit$pos = $Inhalt.IndexOf('119IV')
die Position im String herausfinden. Dann kannst du deine Daten in eine neue Variable packen und den Teil mit der GLN ersetzen. Allerdings geht das nich so einfach per substring sondern:
$neuerInhalt = $inhalt.remove($pos+x, y).insert($pos + x, $neueGLN)
Dabei ist x die relative Position zum gefundenen 119IV an der die GLN steht und y die Länge der alten GLN.
Mit remove/insert kann man auch unterschiedlich lange Teilstücke ersetzen. -
replace wäre auch noch eine gute Alternative
Replace von Position X bis Position Y ist immer schwierig, wenn man nicht 100% genau weiß, dass der dort enthaltene Text *wirklich* nirgendwo sonst vorkommen kann.Evgenij Smirnov
-
Wenn man Mehrfach vorkommen gezielt ersetzen will, kann man mit $var.IndexOf('Suchstring', Start) auch mit der nächsten Suche weitermachen, ob der Bezug zum zu ändernden Wert noch mal vorkommt und das Ganze auch in eine Schleife packen. Liefert IndexOf "-1" zurück ist die Suche nicht erfolgreich.
-
Wenn man Mehrfach vorkommen gezielt ersetzen will, kann man mit $var.IndexOf('Suchstring', Start) auch mit der nächsten Suche weitermachen, ob der Bezug zum zu ändernden Wert noch mal vorkommt und das Ganze auch in eine Schleife packen. Liefert IndexOf "-1" zurück ist die Suche nicht erfolgreich.
Sehr richtig. Aber wenn man weiß, wo der Substring anfängt und endet, kann man sich das auch sparen ;-)Evgenij Smirnov