2016-12-08 67 views
2

我试着写一个脚本,工作过程如下:解析空格分隔的字段

我的输入是8行8列,充满了价值01一个文本文件,用一个空格字符,每个分隔列。

我需要检查每行中的第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

'1' - >' '1',[0]' – PetSerAl

+0

非常感谢你:) –

+2

你是一个性格比较整数。尝试运行'$ rows [$ i] [6] .GetType()'来查看PS用于数据的类型。你也可以删除最后一个'if'并将其更改为'else',因为如果它不是1,那么它是错误的。 – NooGuy

回答

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的方法,无论字段的长度如何,一元运算符-split运算符

  • 标(索引)然后可以基于字段指数而非字符位置

  • 通过-split ...返回所有字段是,因此与字面'1'比较,但是,通常,PowerShell中进行了很多幕后的转换魔力为你:与上面的代码 - 不像用你自己的代码 - 使用1也可以。 (使用下标)在PowerShell中字符串值是一个特殊情况

    • 索引到:它含蓄地对待


    至于为什么你的方法失败字符串作为字符数组,并且使用单个索引(如6)返回[char]实例。

  • 它是涉及二进制运算符,如-eq确定什么类型的RHS(右侧)将被强制为,如果需要一个表达式的LHS(左手侧) ,应用运营商之前:

    • ([char] '1') -eq 1 # !! $false

      • 强制转换的(隐含)[int]类型RHS 1到LHS类型[char]产生的Unicode 码点U+0001,即控制字符而不是“ASCII”数字“1”,这就是为什么在比较失败。

      • @ PetSerAl的帮助,但神秘的建议(在关于这个问题的评论)使用'1'[0],而不是1作为RHS解决了在这种特殊情况下的问题,因为'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++} 
相关问题