我在使用PowerShell从文件中读取数组时遇到问题(我需要使用它,bash工作正常,但我也必须解决PS中的问题)。所以,问题是程序很好地读入$ sofor参数,然后写出
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
}
答案 0 :(得分: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中的对象,那么从长远来看你会更开心。