Powershell - CSV中的空条目

时间:2016-08-28 03:30:08

标签: powershell csv output

我对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

我的问题是什么?如何修复它?

2 个答案:

答案 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(即空字符串)。

您可以先修改属性值,然后过滤空值,最后从那些不空的值中选择随机值来解决此问题:

""