2014-12-04 75 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中的对象,那么从长远来看,您将会更加快乐。