none
PS-Script soll eine Textdatei in eine andere verändert übertragen. RRS feed

  • Frage

  • Hallo zusammen ich habe folgendes Problem und hoffe mir kann dabei jemand helfen,

    mein Scipt soll mit Hilfe einer .ini Funktionieren in der ich den Pfad zum Inputfile festlegen kann sowie den Pfad des Outputfiles. Zudem soll in der .ini gesagt werden können welches Objekt welchem zugeordnet wird. Bsp. EKST ist nachher EKONT.

    Das Script soll Werte aus dem Input- ins Outpufile schreiben.
    Mein Problem ist das die Zeilen in etwa so aussehen:
    @SYS:007111 @MON:201312 @ID:MOBIL1 @SKST:2165570 @ECOA:80687703 @LSTAR:7039 @MAT:990465989 @COW:32,9 @SDW:32,9 @BTXT:1 x Speicherkarte 32 GB - Ridder @RTXT:1 x Speicherkarte 32 GB - Ridder

    Im Outputfile sollen diese aber dann so aussehen:

    SYS;ID;SKST;MAND;KUND;GENA;KONID;EKART;EKONT;LSTAR;ABRINT;ABRVON;MENGE;COWE;RTXT;;;;;;;;
    Rheinfelden;1;2215077825;15;109225;;;;;ITK050;1;201312;1;144;Tel.7281 Cordless einger., Analog demont (05.12.2013 Sp„ne 2 h);;;;;;;;

    Das Outputfile ist eine .csv welche als Exceltabelle später dienen soll.

    Mein Problem ist das ich NUR die werte ausgeben will nicht aber das [SYS:] usw. sondern eben nur den Wert 007111.

    Dann habe ich weiter das Problem, dass ich je nach [SYS] usw. eine andere stelle beschreiben soll im Outputfile.

    Zudem kommt noch das manche Inhalte komplett durch neue ersetzt werden sollen da dies alte Produktnr sind und ich im Outputfile die neuen haben möchte.

    Ich komme kein Stück weiter deswegen hoffe ich das Ihr mir evtl helfen könnt.



    • Bearbeitet Pikaus Mittwoch, 15. Januar 2014 08:02
    Mittwoch, 15. Januar 2014 07:49

Antworten

  • Wenn man Daten Verarbeitet, sollte man die Grundlagen der Datenverarbeitung kennen!
    Diese Grundlagen fehlen dir anscheinend!

    Ein Datensatz besteht nicht, wie du sagst, aus einen Namen und einem Wert, sondern aus vielen Namen und vielen Werten!

    Eine Spalte in Excel ist eine Daten reihe. z.B. in Excel die Spalte [SYS].

    Ein Datensatz ist immer wie eine Zeile in Excel.

    Siehe Bild (zum Bild Anzeigen mit der Rechten Maustaste Bild-Anzeigen):Excel Daten Beispiel

    PowerShell arbeitet mit Objekten nicht mit Text !

    In der Grünen Zeile stehen die Namen der Daten.
    Dies sind in einem PowerShell Objekt die Namen der Properties!

    Bei dir wäre dies z.B. @SYS @ID oder @LSTAR ohne das @ Zeichen.

    Das Orange ist ein Wert (Value) von einem Objekt Property.

    Bei dir wäre das '00711' oder 'Mobil2' wie im Bild zu  sehen.

    Das Gelbe ist ein Datensatz! Das ist der Satz von allen Properties aus einem PowerShell Objekt.
    Ein Objekt = eine Zeile = ein Datensatz !

    Beispielcode:

    # Pfad der Ausgabedatei festlegen (später in der .ini / .xml Datei)
    $OutputFilePath = 'C:\temp\Output.csv'
    
    # inputtext kommt später aus der Input Datei
    $InputText = '@SYS:007111 @MON:201312 @ID:MOBIL1 @SKST:2165570 @ECOA:80687703 @LSTAR:7039 @MAT:990465989 @COW:32,9 @SDW:32,9 @BTXT:1 x Speicherkarte 32 GB - Ridder @RTXT:1 x Speicherkarte 32 GB - Ridder'
    
    # Alle Werte fangem mit einem @ Zeichen an.
    # Deshalb wird der Text am @ Zeichen in einzelne Elemente aufgeteilt
    # un in dem Array $KeysValues als Liste abgelegt 
    $KeysValues = $InputText.Split('@')
    
    # leere Hash-Tabelle erstellen (Name = Wert)
    # um am ende ein Objekt von der Hashtable zu erzeugen
    $Hash = @{}
    
    # jedes Textelemet in $KeysValues einzeln bearbeiten
    ForEach($KeyValue in $KeysValues) {
    
        # Die Werte und die Namen der Werte werden durch einen Doppelpunkt getrennt.
        # Deshalb werden die Namen der Werte von den Werten am ersten vorkommen eines Doppelpunktes aufgeteilt
    
        # äussere Leerzeichen entfernen
        $KeyValue = $KeyValue.Trim()
        
        # leere einträge aus der Liste werden nicht bearbeitet
        If(-not [String]::IsNullOrEmpty($KeyValue)) {
    
            # Position des ersten Doppelpunktes im Text ermitteln
            $ColonPos = $KeyValue.IndexOf(':')
    
            # Name des Wertes aus dem Text herausschneiden (von 0 bis zum 1. Doppelpunkt)
            $PropertyName = $KeyValue.Substring(0,$ColonPos)
        
            # Inhalt des Wertes aus dem Text herausschneiden (1 Zeichen nach dem 1. Doppelpunkt)
            $PropertyValue = $KeyValue.Substring($ColonPos + 1 )
    
            # Wert und den Namen des Wertes der Hash Tabelle hinzufügen
            $Hash.$PropertyName = $PropertyValue
        }
            
    } 
    
    # aus der Hashtabelle ein Objekt machen
    $Object = New-Object -TypeName PSObject -Property $Hash
    
    # Das Objekt in eine CSV Datei Schreiben
    $Object | Export-CSV -NoTypeInformation -Path $OutputFilePath


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Mittwoch, 15. Januar 2014 12:19
    • Als Antwort markiert Pikaus Mittwoch, 15. Januar 2014 12:21
    Mittwoch, 15. Januar 2014 10:43

Alle Antworten

  • Eine .ini entspricht nicht mehr dem Stand der Technik!
    Ich empfehle dir eine .XML Datei zur Initialisierung zu benutzen!

    Du beschreibst viele einzelne Schritte!

    Löse die alle Einzeln und dann hast du das gerammte Problem gelöst ;-) (Teile und Herrsche).

    Fang damit an die Input Datei in Objekte Umzuwandeln.

    In deinem Beispiel für die Inputdatei ist nicht zu erkennen wann eine neuer Datensatz anfängt.
    Man muss Muster erkennen können, sonnst geht es nicht!

    Steht jeder Datensatz in einer Zeile?
    Dann ist das einfach mit Get-Content zu lösen!
    Ist zwischen jedem Datensatz ein Trennzeichen (z.B. Leerzeile)?
    Fängt jeder neue Datensatz mit @SYS: an?


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Mittwoch, 15. Januar 2014 09:22
  • Hallo vielen Dank für die schnelle Antwort.

    Also es gibt verschiedenen Datensätze die immer mit@ anfangen danach aber nen andere Bezeichnung haben können. Ein neuer Datensatz fängt immer mit einem @ an und es gibt mehrere Datensätze in einer Zeile.

    Das doofe ist das die Datensätze unterschiedlich lange bezeichnungen haben z.B. @SYS:, @ID: und @LSTAR:

    In der Outputdatei werden die Datensatzbezeichnungen wieder verändert welche eben in der .ini geregelt werden soll was zu was wird bsp. @EKST: wird später zu EKONT bzw soll in der Spalte EKONT gespeichert werden.

    Mittwoch, 15. Januar 2014 09:40
  • Wenn man Daten Verarbeitet, sollte man die Grundlagen der Datenverarbeitung kennen!
    Diese Grundlagen fehlen dir anscheinend!

    Ein Datensatz besteht nicht, wie du sagst, aus einen Namen und einem Wert, sondern aus vielen Namen und vielen Werten!

    Eine Spalte in Excel ist eine Daten reihe. z.B. in Excel die Spalte [SYS].

    Ein Datensatz ist immer wie eine Zeile in Excel.

    Siehe Bild (zum Bild Anzeigen mit der Rechten Maustaste Bild-Anzeigen):Excel Daten Beispiel

    PowerShell arbeitet mit Objekten nicht mit Text !

    In der Grünen Zeile stehen die Namen der Daten.
    Dies sind in einem PowerShell Objekt die Namen der Properties!

    Bei dir wäre dies z.B. @SYS @ID oder @LSTAR ohne das @ Zeichen.

    Das Orange ist ein Wert (Value) von einem Objekt Property.

    Bei dir wäre das '00711' oder 'Mobil2' wie im Bild zu  sehen.

    Das Gelbe ist ein Datensatz! Das ist der Satz von allen Properties aus einem PowerShell Objekt.
    Ein Objekt = eine Zeile = ein Datensatz !

    Beispielcode:

    # Pfad der Ausgabedatei festlegen (später in der .ini / .xml Datei)
    $OutputFilePath = 'C:\temp\Output.csv'
    
    # inputtext kommt später aus der Input Datei
    $InputText = '@SYS:007111 @MON:201312 @ID:MOBIL1 @SKST:2165570 @ECOA:80687703 @LSTAR:7039 @MAT:990465989 @COW:32,9 @SDW:32,9 @BTXT:1 x Speicherkarte 32 GB - Ridder @RTXT:1 x Speicherkarte 32 GB - Ridder'
    
    # Alle Werte fangem mit einem @ Zeichen an.
    # Deshalb wird der Text am @ Zeichen in einzelne Elemente aufgeteilt
    # un in dem Array $KeysValues als Liste abgelegt 
    $KeysValues = $InputText.Split('@')
    
    # leere Hash-Tabelle erstellen (Name = Wert)
    # um am ende ein Objekt von der Hashtable zu erzeugen
    $Hash = @{}
    
    # jedes Textelemet in $KeysValues einzeln bearbeiten
    ForEach($KeyValue in $KeysValues) {
    
        # Die Werte und die Namen der Werte werden durch einen Doppelpunkt getrennt.
        # Deshalb werden die Namen der Werte von den Werten am ersten vorkommen eines Doppelpunktes aufgeteilt
    
        # äussere Leerzeichen entfernen
        $KeyValue = $KeyValue.Trim()
        
        # leere einträge aus der Liste werden nicht bearbeitet
        If(-not [String]::IsNullOrEmpty($KeyValue)) {
    
            # Position des ersten Doppelpunktes im Text ermitteln
            $ColonPos = $KeyValue.IndexOf(':')
    
            # Name des Wertes aus dem Text herausschneiden (von 0 bis zum 1. Doppelpunkt)
            $PropertyName = $KeyValue.Substring(0,$ColonPos)
        
            # Inhalt des Wertes aus dem Text herausschneiden (1 Zeichen nach dem 1. Doppelpunkt)
            $PropertyValue = $KeyValue.Substring($ColonPos + 1 )
    
            # Wert und den Namen des Wertes der Hash Tabelle hinzufügen
            $Hash.$PropertyName = $PropertyValue
        }
            
    } 
    
    # aus der Hashtabelle ein Objekt machen
    $Object = New-Object -TypeName PSObject -Property $Hash
    
    # Das Objekt in eine CSV Datei Schreiben
    $Object | Export-CSV -NoTypeInformation -Path $OutputFilePath


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Mittwoch, 15. Januar 2014 12:19
    • Als Antwort markiert Pikaus Mittwoch, 15. Januar 2014 12:21
    Mittwoch, 15. Januar 2014 10:43
  • Vielen Vielen Dank!!!

    Das hat mir sehr geholfen.

    Vielen dank für die Mühe =)

    Mittwoch, 15. Januar 2014 12:05