2016-08-28 42 views
0

Ich habe nicht viel Erfahrung mit CSV, also Entschuldigung, wenn ich hier wirklich blind bin.Powershell - Leere Einträge in CSV

Ich habe eine grundlegende CSV und Skript-Setup, um dies zu testen. Die CSV hat zwei Spalten, Buchstaben und Zahlen. Buchstabe geht von A-F und Nummer geht von 1-10. Das bedeutet, dass Number mehr Zeilen als Letter enthält. Wenn Sie also das folgende Skript ausführen, kann die Ausgabe manchmal einen leeren Buchstaben liefern.

$L = ipcsv ln.csv | Get-Random | Select-Object -ExpandProperty Letter 
$N = ipcsv ln.csv | Get-Random | Select-Object -ExpandProperty Number 

Write-Output $L 
Write-Output $N 

Einige Ausgänge kommen als

B 
9 

während andere als

kommen kann
5 

Ich weiß nicht, ob das Problem mein Skript leere Zeilen oder meine CSV nicht ignorieren falsch geschrieben, was unten steht.

Letter,Number 
A,1 
B,2 
C,3 
D,4 
E,5 
F,6 
,7 
,8 
,9 
,10 

Was ist mein Problem hier und wie gehe ich es zu beheben?

+0

Kann nicht in der modernen Powershell reproduzieren (5.0 hier): https://puu.sh/qRd0w/f6a661a173.png – wOxxOm

+0

Ich denke, Sie versuchen, ein einfaches Problem auf eine sehr seltsame Weise zu lösen. Warum erklärst du nicht, was du erreichen willst? – Swonkie

+0

Haben Sie das Trennzeichen '$ L = ipcsv ln.csv -Delimiter ',' | versucht? Get-Random | Select-Object -ExpandProperty Letter' –

Antwort

0

Sie fragen nach einem zufälligen Objekt aus Ihrer CSV, kein zufälliger Buchstabe. Da in einigen Zeilen ein Buchstabe fehlt, können Sie am Ende einen mit einem leeren Buchstabenwert auswählen.

Wenn Sie eine Zeile mit einen Buchstaben auswählen möchten, müssen Sie zuerst die Zeilen filtern, um nur diejenigen mit einem Wert auszuwählen. Auch Sie sould vermeiden, dass die gleiche Datei zweimal gelesen, verwenden Sie ein varible

#$csv = Import-CSV -Path ln.csv 

$csv = @" 
Letter,Number 
A,1 
B,2 
C,3 
D,4 
E,5 
F,6 
,7 
,8 
,9 
,10 
"@ | ConvertFrom-Csv 

$L = $csv | Where-Object { $_.Letter } | Get-Random | Select-Object -ExpandProperty Letter 
$N = $csv | Where-Object { $_.Number } | Get-Random | Select-Object -ExpandProperty Number 

Write-Output $L 
Write-Output $N 

CSV migtht nicht die beste Lösung für dieses Szenario sein. Ex. Sie könnten diese als Arrays im Skript speichern, wie:

$chars = [char[]](65..70) #A-F uppercase letters 
$numbers = 1..10 

$L = $chars | Get-Random 
$N = $numbers | Get-Random 

Write-Output $L 
Write-Output $N 
0

Import-Csv dreht sich jede Zeile in ein Objekt, mit einer Eigenschaft für jede Spalte.

Auch wenn ein oder mehrere Eigenschaftswerte leer sein können, das Objekt existiert noch, und Get-Random hat keinen Grund, zu bestimmen, dass ein Objekt mit einer bestimmten Eigenschaft (wie Letter) "" den Wert (dh. Ein leerer String), sollte nicht gepflückt werden.

Sie können dieses Problem beheben, indem man zuerst die Eigenschaftswerte erweitert, dann für leere Werte filtern und dann schließlich den Zufallswert von denjenigen auswählen, die nicht leer waren:

$L = ipcsv ln.csv |Select-Object -ExpandProperty Letter |Where-Object {$_} |Get-Random 
$N = ipcsv ln.csv |Select-Object -ExpandProperty Number |Where-Object {$_} |Get-Random