2016-05-11 4 views
0

Ich habe eine CSV-Datei (Trennzeichen ist |), die AD-Felder als Header und die Strings hat, um dort als die Daten zu gehen. Ich möchte eine Hash-Tabelle aus dieser CSV-Datei erstellen, die die Spaltenüberschrift als Schlüssel und die Zeichenfolge als Daten enthält. HierPowershell verwenden, um Hash-Tabelle aus .CSV-Datei mit Header erstellen

ist das Dateiformat:

LastName|FirstName|Office|Employeeid|BusinessTitle|CoreSector|Sector|CmbCorePractice|CmbPractice|Region|Committees|SectorLeaderRole|PracticeLeaderRole|AreaCountryRole|FirmLeaderShipRoleOne|FirmLeaderShipRole|generationQualifier|givenName|middlename|sn|extensionAttribute12|homePostalAddress|telephoneNumber|ipPhone|facsimileTelephoneNumber|mobile|homePhone|department|manager|assistant|extensionAttribute13 
SMITH|JAMES|AMSTERDAM|0000000000|Leader|Healthcare|#|#|#|Europe|#|#|#|#|#|#|MR|JAMES|#|SMITH|#|#|+1 212 000 7692|0000|#|#|#|Knowledge Management|0001000000|#|#|#|# 

Die Daten beginnt mit SMITH und Linien mit LastName.

+3

Es würde uns helfen, zu sehen: zB CSV-Daten (verschleierten, natürlich), und der Code, den Sie bereits versucht haben zu implementieren (und wo es fehlgeschlagen ist). – gravity

+2

Aber warum? :) Ein Array von Objekten ist so viel einfacher zu handhaben, sicherer (Sie wissen 100% sicher, welche Attributwerte zusammengehören) und es wird leicht importiert mit '$ ad = import-csv -pfad myfile.csv -limimiter" | "' –

+0

@Frodef. - Ich möchte schließlich vergleichen, was in der CSV-Datei mit dem in AD ist, so dass ich AD nur mit dem, was in der Datei ist, aktualisieren kann, da die Datei die Quelle ist und ich dachte, Hash-Tabellen wären die besten. Im Moment durchläuft mein aktuelles Skript die .csv-Datei und aktualisiert AD mit den Informationen, ob es neu ist oder nicht (die Informationen könnten in Datei und AD identisch sein, die Datei überschreibt jedoch AD). – allenr74

Antwort

3

Das ist einfach genug. Lesen Sie die erste Zeile der CSV die Schlüssel für die Hash-Tabelle zu erhalten, wie folgt aus:

$keys = (Get-Content 'C:\path\to\your.csv' -TotalCount 1) -split '\|' 

oder so:

$keys = (Get-Content 'C:\path\to\your.csv' -TotalCount 1).Split('|') 

Next Import der CSV:

$csv = Import-Csv 'C:\path\to\your.csv' -Delimiter '|' 

Dann sammeln die Spalten der CSV in eine Hash-Tabelle:

$ht = @{} 
foreach ($key in $keys) { 
    $ht[$key] = $csv | Select -Expand $key 
} 
+0

Danke @AnsgarWiechers Ich habe dein Skript versucht, aber es scheint die Schlüssel in einzelne Zeichen aufzuteilen. Es scheint mit dem ersten Datensatz, aber nicht mit nachfolgenden Datensätzen zu arbeiten. Ich werde die Quelldatei anhängen. – allenr74

+1

@ allenr74: Versuchen Sie '-split '\ |'' anstelle von '-split '|''. Das Trennzeichen-Argument des "-Split" -Operators wird als regulärer Ausdruck interpretiert. Um also ein Literal '|' zu verwenden, muss es '\' -escaped sein. – mklement0

0

Ich bin auf diesen Beitrag gestoßen, als ich versuchte herauszufinden, wie ich etwas Ähnliches machen könnte. Mein Ziel war es auch, die Spaltennamen generisch aus der ersten Zeile der CSV zu übernehmen (Gutschrift auf Ansgar Wiechers' exzellente Antwort zur Lösung dieses Problems für mich). Ansgar's answer erstellt eine Hashtabelle, wobei der Wert jedes Schlüssels ein Array aller Werte für diesen Schlüssel ist.

Für meine Zwecke brauchte ich ein Array, wo der Wert jedes Elements eine Hashtabelle ist. Das heißt, jedes Element des Arrays entspricht einer Zeile in der ursprünglichen CSV. Dies bietet mir den Vorteil, dass ich jeden Datensatz in der CSV-Datei durchlaufen und dann jede Spalte im Datensatz durchlaufen kann.

Da die Anforderungen des OP, für welches Format er seine Daten letztendlich benötigt hatte, eindeutig nicht eindeutig waren, dachte ich, ich würde meine Lösung als Ergänzung zu Ansgar's posten.

Beachten Sie, dass zur Anpassung an den spezifischen Anwendungsfall des OP nur der Wert $DELIM von , zu | geändert werden muss.

# Constants. 
$DELIM = ',' 
$CSV_F = 'file.csv' 

# Parse keys 
$keys = (gc "${CSV_F}" -TotalCount 1).Split($DELIM) 
$csv = Import-CSV "${CSV_F}" 
$data = @() 

# Iterate through CSV to build array of hashtables. 
ForEach ($r in $csv) { 
    $tmp_h = @{} 

    # Create hash of key-value pairs. 
    ForEach($k in $keys) { 
     $tmp_h[$k] = $r.($k) 
    } 

    # Add hash to array of hashes. 
    $data += $tmp_h 
} 

# Display data 
$data.ForEach({[PSCustomObject]$_}) | ft -AutoSize 

Angesichts der folgenden Beispieldaten in file.csv:

RecordId,Name,Value 
1,Alpha,Kilo 
2,Bravo,Lima 
3,Charlie,Mike 
4,Delta,November 
5,Echo,Oscar 
6,Foxtrot,Papa 
7,Golf,Quebec 
8,Hotel,Romeo 
9,India,Sierra 
10,Juliet,Tango 

Die folgende Ausgabe generiert:

Name Value RecordId 
---- ----- -------- 
Alpha Kilo  1 
Bravo Lima  2 
Charlie Mike  3 
Delta November 4 
Echo Oscar 5 
Foxtrot Papa  6 
Golf Quebec 7 
Hotel Romeo 8 
India Sierra 9 
Juliet Tango 10 
Verwandte Themen