我对CSV没有多少经验,如果我真的在这里失明,请道歉。
我有一个基本的CSV和脚本设置来测试它。 CSV有两列,Letter和Number。信件来自A-F,编号从1-10开始。这意味着Number的行数多于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 :(得分:0)
您要求CSV中的随机对象,而非随机字母。由于某些行缺少一个字母,您最终可能会选择一个具有空字母值的行。
如果您想选择 >>任意一行,您需要首先过滤行,只选择具有值的行。此外,您应避免两次读取同一文件,使用变量
#$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不是此方案的最佳解决方案。防爆。您可以将这些作为数组存储在脚本中,例如:
$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
答案 1 :(得分:0)
Import-Csv
将每一行转换为一个对象,每列都有一个属性。
即使一个或多个属性值可能为空,对象仍然存在,Get-Random
没有理由确定具有特定属性的对象(例如{{1}不应该选择值Letter
(即空字符串)。
您可以先修改属性值,然后过滤空值,最后从那些不空的值中选择随机值来解决此问题:
""