none
Verstaendnisproblem / Export-Excel RRS feed

  • Frage

  • Hallo allseits,

    ich konnte mein Problem zwar selbst lösen, warum aber meine ersten Versuche dazu nicht klappten, kann ich nicht sagen, da hab ich rundherum noch einige Verständnisprobleme - wäre nett, wenn mir da jemand etwas weiterhelfen könnte. Der Reihe nach:

    Ich habe ein Script geschrieben, welches Daten aus einer DB (Netezza, eine Fremd-DB von IBM) ausliest, und diese Daten in ein Excel schreibt. Mein erster Versuch, der die Daten mal nur in ein CSV schreibt, sieht so aus:

    function Get-ODBC-Data{
        param(
            [string]$query=$(throw 'sql-query is required.'),
            [string]$dsn
        )
        $conn = New-Object System.Data.Odbc.OdbcConnection
        $conn.ConnectionString = "DSN=$dsn;"
        try
        {
            $conn.open()
            $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
            $ds = New-Object system.Data.DataSet
            (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
            $conn.close()
        }
        catch
        {
            $fehler = $_
            Write-Host ("### ABGEFANGENER FEHLER: " + $_.Exception.Message) -ForegroundColor yellow
        }
        
        # Zurückgegeben wird das DataSet
        $ds.Tables[0]
    }
    
    # Daten von Netezza abholen und in CSV-File schreiben ...
    
    $sqlCommand="select * from bdv.BAD_DATA_REPORT_V order by 1,2,3"
    
    Get-ODBC-Data $sqlCommand "NZSQL" | Export-CSV -Path "C:\File01.csv" -NoTypeInformation

    Das geschriebene CSV sieht gleich wirklich gut aus, ich bekomme die Daten genau so, wie ich sie dann auch im Excel haben will. Hier ein kurzer Auszug der erzeugten Datei file01.csv

    "STP","MDIF","FELD","WERT","KOMMENTAR","MDIF_PAKET","IMPORTZEIT"
    "INPVS","VSSTAMMJAHR","vsPersID","","Mandatory Felder nicht bef?llt","INPVS_VSStammJahr_HVB_1_1_32_20200626_20200626.mdif","02.07.2020 12:25:07"
    "INPVS","VSSTAMMJAHR","vsPersID","","Mandatory Felder nicht bef?llt","INPVS_VSStammJahr_HVB_1_1_32_20200703_20200703.mdif","08.07.2020 12:58:13
    
    ......."

    Die erste Zeile ist die HeaderZeile mit den DB-Feldnamen, dann kommen die Daten, genau so will ich das auch. Also nur noch "Export-CSV" durch "Export-Excel" ersetzen, dann müsste ja alles richtig funktionieren. Also so:

    Get-ODBC-Data $sqlCommand "NZSQL" | Export-Excel -Path "C:\File01.xlsx"

    Das erzeugt mir aber einige *zusätzliche* Spalten (RowError, RowState, Table, ItemArray, HasErrors) im Excel. Ich sehe diese zusätzlichen Spalten NICHT, wenn ich z.B. folgendes ausprobiere:

    (Get-ODBC-Data $sqlCommand "NZSQL")[0]

    Ich habe dann versucht, nur mehr die benötigten Spalten (woher kommen RowError usw.??) mittels "Format-Table" zu selektieren, also so:

    Get-ODBC-Data $sqlCommand "NZSQL" | ft STP, MDIF, FELD | Export-Excel -Path "C:\File01.xlsx"

    Das aber dürfte komplett falsch sein, da bekomme ich in's generierte Excel nur mehr "interne Klasseninformationen" und nichts von meinen Daten ...

    Die Lösung dieses Problems hab ich dann im Netz gefunden, richtig funktioniert's mit "Select-Object", also so:

    Get-ODBC-Data $sqlCommand "NZSQL" |
    Select-Object * -ExcludeProperty RowError, RowState, Table, ItemArray, HasErrors |
    Export-Excel -Path "C:\\File01.xlsx"
    
    

    Die Fragen die ich habe:

    - Woher kommen die überzähligen Felder, die ich beispielsweise bei (Get-ODBC-Data $sqlCommand "NZSQL")[0] NICHT habe, her?

    - Warum funktioniert mein erster Ansatz mit "Format-Table" nicht, bzw. was bekomme ich da eigentlich angezeigt?

    Danke u. LG., Michael

    Montag, 13. Juli 2020 08:43

Antworten

  • Get-ODBC-Data liefert ein Objekt zurück, dass entsprechende Eigenschaften und Methoden hat.
    Per Pipe wird die Serialisierung eines Objektes aufgerufen um sie vom nächsten CMD-Let auswerten zu lassen.
    Bei einer Serialisierung werden allerdings auch versteckte Eigenschaften und Felder (Private, Protected) serialisiert um u.U. das Originalobjekt wieder herstellen zu können.
    Somit bekommst du Eigenschaften zu sehen, die man mit Get-Member nicht zu sehen bekommt.

    Eine Beschreibung von Get-ODBC-Data finde ich nicht. Ggf. ist das was eigenes?

    Verwendung von ODBC findest du hier:
    https://www.andersrodland.com/working-with-odbc-connections-in-powershell/

    Und wo steht geschrieben, dass bei -ExcludeProperty die Property auch da sein muss?

    Übrigens: die genannten Eigenschaften deuten auf Eigenschaften eines DataRow-Objektes hin.
    Du gibst aber ein DataTable-Objekt per Pipe weiter, dass diese Eigenschaften nicht enthält.

    Montag, 13. Juli 2020 10:47
  • die überzähligen Felder kommen offensichtlich vom Excel-Modul


    Glaube ich nicht, denn dann würde

    Get-ODBC-Data $sqlCommand "NZSQL" |
    Select-Object * -ExcludeProperty RowError, RowState, Table, ItemArray, HasErrors |
    Export-Excel -Path "C:\\File01.xlsx"
    nicht funktionieren. Daß (Get-ODBC-Data $sqlCommand "NZSQL")[0] nicht alles anzeigt, liegt am Standardverhalten der Objekte. Pipe das mal in Format-List * oder Get-Member, dann siehst Du, was an Properties alles enthalten ist - und die werden ALLE an Export-Excel durchgereicht. Nicht nur die, die im defaultDisplaySet stehen. Mehr dazu: https://learn-powershell.net/2013/08/03/quick-hits-set-the-default-property-display-in-powershell-on-custom-objects/

    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Montag, 13. Juli 2020 10:08

Alle Antworten

  • Moin,

    kannst Du den Code bitte als Code posten?


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Montag, 13. Juli 2020 08:47
  • Schon getan, sorry. Funktioniert BBCode hier eigentlich nicht? Vorschau-Funktion gibt's ja auch keine - oder?
    Montag, 13. Juli 2020 08:56
  • Nee, kein BBCode. Aber das Nachfolgeprodukt wird noch schlimmer: https://docs.microsoft.com/en-us/answers/products/

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Montag, 13. Juli 2020 08:57
  • Moin,

    die überzähligen Felder kommen offensichtlich vom Excel-Modul. Da es eine Eigenkreation von Doug Finke ist, wird es schwierig sein, hier dazu Support zu geben. Aber Doug ist, im Gegensatz zu Microsoft, direkt ansprechbar und könnte Dir evtl. direkt helfen.

    Format-Table gibt Strings aus, pro Tabellenzeile einen String. Damit ist die Datenstruktur dann weg, es ist also ein reines Anzeige-Cmdlet.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Montag, 13. Juli 2020 09:13
  • die überzähligen Felder kommen offensichtlich vom Excel-Modul


    Glaube ich nicht, denn dann würde

    Get-ODBC-Data $sqlCommand "NZSQL" |
    Select-Object * -ExcludeProperty RowError, RowState, Table, ItemArray, HasErrors |
    Export-Excel -Path "C:\\File01.xlsx"
    nicht funktionieren. Daß (Get-ODBC-Data $sqlCommand "NZSQL")[0] nicht alles anzeigt, liegt am Standardverhalten der Objekte. Pipe das mal in Format-List * oder Get-Member, dann siehst Du, was an Properties alles enthalten ist - und die werden ALLE an Export-Excel durchgereicht. Nicht nur die, die im defaultDisplaySet stehen. Mehr dazu: https://learn-powershell.net/2013/08/03/quick-hits-set-the-default-property-display-in-powershell-on-custom-objects/

    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Montag, 13. Juli 2020 10:08
  • Get-ODBC-Data liefert ein Objekt zurück, dass entsprechende Eigenschaften und Methoden hat.
    Per Pipe wird die Serialisierung eines Objektes aufgerufen um sie vom nächsten CMD-Let auswerten zu lassen.
    Bei einer Serialisierung werden allerdings auch versteckte Eigenschaften und Felder (Private, Protected) serialisiert um u.U. das Originalobjekt wieder herstellen zu können.
    Somit bekommst du Eigenschaften zu sehen, die man mit Get-Member nicht zu sehen bekommt.

    Eine Beschreibung von Get-ODBC-Data finde ich nicht. Ggf. ist das was eigenes?

    Verwendung von ODBC findest du hier:
    https://www.andersrodland.com/working-with-odbc-connections-in-powershell/

    Und wo steht geschrieben, dass bei -ExcludeProperty die Property auch da sein muss?

    Übrigens: die genannten Eigenschaften deuten auf Eigenschaften eines DataRow-Objektes hin.
    Du gibst aber ein DataTable-Objekt per Pipe weiter, dass diese Eigenschaften nicht enthält.

    Montag, 13. Juli 2020 10:47
  • Herzlichen Dank allen Antwortenden!

    Das mit den "Versteckten Eigenschaften und Feldern" ist zwar eigentlich klar (und so wird auch verständlich, warum "write-excel" vermeintlich Felder "dazuerfindet"), war mir aber nicht so bewusst ... :)

    Dienstag, 14. Juli 2020 05:29