2014-12-04 102 views
0

我遇到了用PowerShell從文件讀入數組的問題(我需要使用它,bash工作正常,但我必須在PS中解決問題)。所以,問題是,該方案很好地讀入$ sofor參數,然後寫出PowerShell - 讀入變量失敗

Write-Host $fajl[$i].split(",")[3] 

線沒有問題,但是當我嘗試讀取到數組中的下一行,我得到一個錯誤:

Cannot index into a null array. 
    At C:\Users...\PSa1.ps1:16 char:5 
    +     Write-Host $pontszam[$i] 
    +     ~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : NullArray 

我不知道爲什麼它的作品第一次,不在第二。任何想法?將不勝感激。看代碼:

switch ($param) 
{ 
    -v { 
     $fajl = Get-Content C:\Users\freeze\Desktop\powershell\formula1.csv 
     $i = 0 
     while ($i -lt $fajl.length) { 
      $sofor[$i] = $(($fajl)[$i].split(",")[1]); 
      Write-Host $fajl[$i].split(",")[3] 
      $pontszam[$i] = $($fajl[$i].split(",")[3]); 
      Write-Host $sofor[$i] 
      Write-Host $pontszam[$i] 
      $i = $i + 1 
     } 

回答

4

所以你使用一個非常Bash的方式做到這一點(可以理解,因爲你有一個工作的Bash解決方案)。您正在嘗試使用文件中的字符串(可以理解來自Bash)。 Powershell是用內置對象的概念構建的,所以這是一個更好的方法來處理這個問題。

讓我們從Powershell已經理解CSV的事實開始。因此,首先將CSV加載到內存中:

$fajl = Import-CSV C:\Users\freeze\Desktop\powershell\formula1.csv 

假設CSV具有標題行。如果沒有,您可以在導入時指定列名稱:

$fajl = Import-CSV C:\Users\freeze\Desktop\powershell\formula1.csv -Header @('H1', 'H2', 'H3', 'H4') 

只需使用所需的任何列名稱並使其與數據匹配即可。

現在我們可以使用CSV行作爲對象數組。所以,如果我明白你正在嘗試做一個循環像這應該工作(我假設我在前段代碼使用的頭使用過程中的正確列名。):

$sofor = @() 
$pontszam = @() 
foreach($row in $fajl){ 
    $sofor += $row.H2 
    $pontszam += $row.H4 
    Write-Host $row.H2 
    Write-Host $row.H4 
} 

剛添加一些東西,我懷疑你的初始方法不起作用,因爲在你嘗試向它添加一個數組元素之前,你沒有創建一個數組$ sofor。我認爲在循環之前放置$ sofor = @()可能會解決問題。如果您開始學習如何使用Powershell中的對象,那麼從長遠來看,您將會更加快樂。