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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
die erste Sache ( und die einzige... sorry), dass kam in meinem Kopf ist:
für die erste Spalte Werte und
für die zweite Spalte und so weiter....
ist es das, was Sie brauchen?
$csvData | % { $_.$(( $csvData | gm | ? { $_.membertype -eq "noteproperty" -and $_.Name -like $($headers[0])} ).name) }
Ich denke, Sie wollen diese:
Wählen Sie die Kopfzeilen, die der Bedingung entsprechen (in diesem Fall, diejenigen, die endet mit den Zeichen) und dann die csv-Daten für diesen Headern.
können Sie ein benutzerdefiniertes Skript zum Parsen von csv-manuell: