Eine variable, die durch die dynamische variable-name

Wie funktioniert ein access-Daten-Import aus einer CSV-Datei durch die Verwendung von dynamischen note property-Namen? Das heißt, man weiß nicht, die colunm Namen vorher. Tun Sie einem Muster entsprechen, und sind ein Auszug aus der CSV-Datei, wenn das Skript ausgeführt wird.

Als ein Beispiel, sollten Sie eine CSV-Datei:

"Header 1","Header A","Header 3","Header B"
0,0,0,0
1,2,3,4
5,6,7,8

Möchte ich extrahieren Sie nur Spalten, das Ende mit einem Brief. Um dies zu tun, lese ich die header-Zeile, und extrahieren Sie die Namen mit einem regex so

$reader = new-object IO.StreamReader("C:\tmp\data.csv")
$line = $reader.ReadLine()
$headers = @()

$line.Split(",") | % {
    $m = [regex]::match($_, '("Header [A-Z]")')
    if($m.Success) { $headers += $m.value } }

Diese erhalten alle Spalten-Namen, die ich kümmern:

"Header A"
"Header B"

Nun Zugriff auf eine CSV-Datei, die ich importieren möchte, so,

$csvData = import-csv "C:\tmp\data.csv"

Import-CSV-Datei erstellen, die ein benutzerdefiniertes Objekt, das Eigenschaften hat, die als pro der Kopfzeile. Man kann auf die Felder von NoteProperty Namen wie so,

$csvData | % { $_."Header A" } # Works fine

Dies erfordert natürlich einen wissen, den Namen der Spalte im Voraus. Ich möchte die colunn Namen, die ich extrahiert und gespeichert in die $headers. Wie soll ich das tun?

Einige Dinge, die ich habe versucht, so weit

$csvData | % { $_.$headers[0] } # Error: Cannot index into a null array.
$csvData | % { $np = $headers[0]; $_.$np } # Doesn't print anything.
$csvData | % { $_.$($headers[0]) } # Doesn't print anything.

Konnte ich das Skript ändern möchte, so schreibt er einem anderen ein Skript, das nicht wissen, den Namen der Spalten. Ist, dass meine einzige Lösung?

InformationsquelleAutor vonPryz | 2011-12-15
Schreibe einen Kommentar