我正在尝试编写一个如下工作的脚本:
我的输入是一个包含8行和8列的文本文件,其中填充了值0
或1
,每个字符用于分隔列。
我需要检查每行中的第4个数字,如果是false
则输出0
,如果是true
,则输出1
。
我的代码目前看起来像这样:
param($fname)
$rows = (Get-Content $fname)
for ($i=0;$i -lt $rows.Length;$i++)
{
if ($rows[$i][6] -eq 1)
{
Write-Host "true"
}
if ($rows[$i][6] -ne 1)
{
Write-Host "false"
}
}
所以我使用[$i][6]
,因为我得到的是第4个数字,占空格数作为分隔符。
我检查过并认为它很完美,但不知怎的,它为每条行说false
,但当我Write-Host
$rows[0][6]
时它是{{1} }。
答案 0 :(得分:0)
<强> TL;博士强>
# Create sample input file, with values of interest in 4th field
# (0-based field index 3).
@'
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
'@ > file
foreach ($line in (Get-Content file)) {
$fields = -split $line
if ($fields[3] -eq '1') {
"true"
} else {
"false"
}
}
的产率:
false
true
您的原始代码需要考虑许多细微之处,但上面的代码:
通过将每个输入行分成空格分隔的字段,提供更多类似awk
的方法,无论字段的长度如何,由一元{提供} { {1}}运营商。
下标(索引)可以基于字段索引而不是字符位置。
-split
返回的所有字段都是字符串,因此与字符串文字-split ...
进行比较,但通常,PowerShell执行很多幕后转换魔法:使用上面的代码 - 与您自己的代码不同 - 使用'1'
也会有效。
至于为什么你的方法失败:
在PowerShell中索引(使用下标) string 值是一种特殊情况:它隐式将字符串视为字符数组,并且,使用单个索引(例如1
),返回6
个实例。
包含二元运算符(如[char]
)的表达式的 LHS (左侧)决定 RHS 的类型(如果需要),在应用运营商之前,(右侧)将被强制:
-eq
将(隐含的)([char] '1') -eq 1 # !! $false
类型的RHS [int]
强制转换为LHS类型1
会产生Unicode 代码点 [char]
,即,控制字符而不是&#34; ASCII&#34;数字&#39; U+0001
&#39;,这就是比较失败的原因。
@ PetSerAl提供了一些有用但含糊的建议(在对问题的评论中)使用1
而不是'1'[0]
,因为RHS解决了这个特殊情况下的问题,因为1
将'1'[0]
作为1
实例返回,但解决方案并未概括为多字符字段值。
[char]
'1' -eq 1 # $true; same as: ([string] 1) -eq 1 or ([string] 1) -eq '1'
转换为字符串确实与1
相同。答案 1 :(得分:0)
此脚本使用矩阵文件中的适当值填充真正的二维数组,但输出不适合。
$Array = New-Object "bool[,]" 8,8
[int]$i=0 ; [int]$j=0
get-content $fname|foreach{ foreach ($b in ($_ -split(' '))) {
"{0},{1}={2}" -f $i,$j,($b -eq 0)
$Array[$i,$j] = ($b -eq 0)
$j++}
$j=0; $i++}