2016-10-27 11 views
0

Es gibt quite und fewposts auf SO, die PowerShell-Transposition adressieren. Der Großteil des Codes ist jedoch spezifisch für den Anwendungsfall oder Adressen, die aus einer Text/CSV-Datei gesammelt werden, und das tut mir nicht gut. Ich würde gerne eine Lösung sehen, die diese Arbeit ohne solche Besonderheiten erledigen kann und mit Arrays direkt in PS arbeitet.Generisch Transponieren von PowerShell-Array-Zeilen in Spalten

Beispieldaten:

Customer Name: SomeCompany 
Abbreviation: SC 
Company Contact: Some Person 
Address: 123 Anywhere St. 
ClientID: XXXX 

Diese Daten sind viel komplizierter, aber ich kann mit ihr arbeiten mit anderen Methoden, wenn ich nur die Zeilen und Spalten erhalten können zusammenarbeiten. Die Array-Dinge, die "Name:" und "SomeCompany" sind Spaltenüberschriften. Dies ist ein Nebenprodukt dessen, wie die Daten gesammelt und nicht geändert werden können. Ich importiere die Daten aus einer Excel-Tabelle mit PSExcel und das Tabellenformat ist nicht änderbar.

gewünschte Ausgabe:

Customer Name:, Abbreviation:, Company Contact:, Address:, ClientID: 
SomeCompany, SC, Some Person, 123 Anywhere St., XXXX 

Beispiel für Dinge, die ich habe versucht:

$CustInfo = Import-XLSX -Path "SomePath" -Sheet "SomeSheet" -RowStart 3 -ColumnStart 2 
$b = @() 
foreach ($Property in $CustInfo.Property | Select -Unique) { 
    $Props = [ordered]@{ Property = $Property } 
    foreach ($item in $CustInfo."Customer Name:" | Select -Unique){ 
     $Value = ($CustInfo.where({ $_."Customer Name:" -eq $item -and 
        $_.Property -eq $Property })).Value 
     $Props += @{ $item = $Value } 
    } 
    $b += New-Object -TypeName PSObject -Property $Props 
} 

Das funktioniert nicht, weil die "anderen" Daten, die ich erwähnte. Es gibt viele andere Abschnitte in dieser bestimmten Arbeitsmappe, so dass "Select-Unique" ohne Fehler fehlschlägt und die Ausgabe leer ist. Wenn ich die Eingabe beschränken könnte, um nur die Zeilen/Spalten auszuwählen, die ich brauchte, könnte das eine Chance haben. Es scheint, dass, während es einen "RowStart" und einen "ColumnStart" zu Import-XLSX gibt, es keine Eigenschaften gibt, um einen zu stoppen.

Ich habe Methoden aus den oben verlinkten SO Fragen versucht, aber wie gesagt, sie sind entweder zu spezifisch für die Frage Daten oder gelten für den Import von CSV-Dateien und nicht mit Arrays arbeiten.

+0

Woher wissen Sie, dass ein Datensatz beendet ist und der nächste beginnt? – Eris

+0

@Eris Wenn ich es richtig verstehe, verwendet es die gesamte Zeile als einen Datensatz, da es aus einer Excel-Tabelle importiert wird. – McKenning

+0

Da Ihre Eingabe "record" aus 5 (?) Zeilen besteht, woher wissen Sie, dass sie bei "ClientId" endet? Wenn Sie kein Trennzeichen zwischen Gruppen von Werten haben, die Sie zu einem Ausgabeobjekt machen wollen, ist es unmöglich zu trennen. – Eris

Antwort

0

konnte ich dieses Problem zu beheben, indem zwei Dinge zu tun:

mit dem „-Header“ Schalter auf der Import-Funktion XLSX
  1. entfernt die zusätzlichen Spalten gefälschten Header-Namen hinzufügen und dann nur diejenigen wählen Kopfzeilen.

    $CustInfo = Import-XLSX -Path "SomePath" -Sheet "SomeSheet" -RowStart 2 -ColumnStart 2 -Header 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 | Select "1","2" 
    

Der Nachteil ist, dass ich, wie viele Spalten die Eingangsdaten musste wissen, hatte - nicht dynamisch. Wenn jemand eine Lösung für dieses Problem anbieten kann, wäre ich dankbar.

  1. Flipped die Spalten und Header mit einem einfachen foreach-Schleife:

    $obj = [PSCustomObject]@{} 
    ForEach ($item in $CustInfo) { 
        $value = $null 
        $name = $null 
        if ($item."2") { [string]$value = $item."2" } 
        if ($item."1") { [string]$name = $item."1" } 
        if ($value -and $name) { 
         $obj | Add-Member -NotePropertyName $name -NotePropertyValue $value 
        } 
    } 
    

Ich hatte String-Typ auf den Eigenschaftsnamen und Werte, weil der Reißverschluss zu zwingen Codes und CustID wurde als Int32 formatiert. Ansonsten macht das, was ich brauche.

Verwandte Themen