解析以空格分隔的字段

时间:2016-12-08 22:52:24

标签: powershell split type-conversion

我正在尝试编写一个如下工作的脚本:

我的输入是一个包含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} }。

2 个答案:

答案 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++}