2016-12-08 106 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++} 
相關問題