2016-08-28 3 views
0

У меня нет большого опыта работы с CSV, поэтому извиняюсь, если я действительно ослеп здесь.Powershell - Пустые записи в CSV

У меня есть базовая настройка CSV и скрипта для проверки этого. CSV имеет два столбца: Letter и Number. Письмо идет от A-F, а Number - от 1 до 10. Это означает, что число имеет больше строк, чем Letter, поэтому при запуске следующего скрипта вывод иногда может содержать пустое письмо.

$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 

Некоторые выходы вышли в

B 
9 

в то время как другие могут выйти, как

5 

Я не знаю, является ли этот вопрос мой сценарий не игнорирует пустые строки или мой CSV написано неправильно, которое опубликовано ниже.

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

Какая у меня проблема и как ее исправить?

+0

Не удается воспроизвести в современной PowerShell (5,0 здесь): https://puu.sh/qRd0w/f6a661a173.png – wOxxOm

+0

Я думаю, вы пытаетесь решить простую проблему очень странным образом. Почему бы вам не сказать, чего вы пытаетесь достичь? – Swonkie

+0

Вы пытались использовать разделитель '$ L = ipcsv ln.csv -Delimiter ',' | Get-Random | Select-Object -ExpandProperty Letter' –

ответ

0

Ваш запрос случайного объекта из вашего CSV, а не случайной буквы. Поскольку в некоторых строках отсутствует письмо, вы можете выбрать тот, у которого есть пустое значение Letter.

Если вы хотите выбрать любую строку с письмом, вам нужно сначала отфильтровать строки, чтобы выбрать только те, которые имеют значение. Кроме того, вы sould не читать тот же файл дважды, используйте 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 быть лучшим решением для этого сценария. Ex. Вы можете хранить их как массивы в сценарии, как:

$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 превращает каждую строку в объект со свойством для каждого столбца.

Даже если одно или несколько значений свойств могут быть пустыми, то объект все еще существует, и Get-Random не имеют никаких оснований определить, что объект с определенным свойством (такие как Letter), имеющим значение "" (то есть. Пустая строка), не следует выбирать.

Вы можете исправить это за счет расширения значений свойств, а затем отфильтровать пустые значения, а затем, наконец, выбрать случайное значение из тех, которые не были пустыми:

$L = ipcsv ln.csv |Select-Object -ExpandProperty Letter |Where-Object {$_} |Get-Random 
$N = ipcsv ln.csv |Select-Object -ExpandProperty Number |Where-Object {$_} |Get-Random 
Смежные вопросы