none
Datei durchsuchen und an bestimmten Stellen etwas hinzufügen RRS feed

  • 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 :) 

    Montag, 24. August 2020 13:08

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

    http://evgenij.smirnov.de

    Montag, 24. August 2020 14:00

Alle Antworten

  • Daher hoffe ich jetzt hier auf hilfe :) 

    Klar doch. Zeig doch mal (bitte Code als Code posten!), was Du schon probiert hast, und wo der Schuh drückt. Vielleicht auch mal ein paar, gerne pseudonymisierte, EDI-Zeilen...

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Montag, 24. August 2020 13:17
  • 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

    Montag, 24. August 2020 13:36
  • Montag, 24. August 2020 13:54
  • 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

    http://evgenij.smirnov.de

    Montag, 24. August 2020 14:00
  • 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

    Montag, 24. August 2020 14:14
  • 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.

    Montag, 24. August 2020 14:22
  • Die GLN ist doch eindeutig ? Bei Satzart 119IV von zeichen 7 bis 13 ist immer die GLN die ist ja immer gleich lang. 

    Ich verstehe halt absolut nicht wie ich das sonst teilen und wieder zusammen fügen sollte 

    Montag, 24. August 2020 14:27

  • 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

    http://evgenij.smirnov.de

    Montag, 24. August 2020 14:38
  • 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.

    Montag, 24. August 2020 14:54
  • 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.

    Montag, 24. August 2020 15:02
  • Nicht so schnell ^^ EDI ist nicht gleich EDI :p 

    Den EDI Standart den wir  nutzen ist um einiges einfacher ;) Dieser wird duch ein Clearingcenter übersetzt und sieht am ende aus wie deiner. Aber zu Anfang ist er einfacher

    Montag, 24. August 2020 18:52
  • 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.

    Montag, 24. August 2020 21:09
  • replace wäre auch noch eine gute Alternative
    Dienstag, 25. August 2020 11:52
  • 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

    http://evgenij.smirnov.de

    Dienstag, 25. August 2020 12:07
  • 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.
    Dienstag, 25. August 2020 15:21
  • 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

    http://evgenij.smirnov.de

    Dienstag, 25. August 2020 15:45
  • Jepp, aber auch nur wenn man die Zeile (wie hier gefordert) kennt:

    "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)"

    ;-)

    Dienstag, 25. August 2020 16:13