如何在PowerShell中循环遍历CSV文件中的一行

36

我想在PowerShell中处理一个CSV文件,但是当它被处理时,我不知道CSV文件中的列标题是什么。

例如:

$path = "d:\scratch\export.csv"
$csv = Import-csv -path $path

foreach($line in $csv)
{ 
    foreach ($head in $line | get-member | where-object {$_.MemberType -eq "NoteProperty"} | select Definition)
    {
        #pseudocode...
        doSomething($head.columnName, $head.value)
    }

}

我该怎样循环读取CSV文件中的每一行,获取列名和对应的值?或者有没有其他更好的方法实现这个功能(比如不使用Import-Csv)?

3个回答

56
Import-Csv $path | Foreach-Object { 

    foreach ($property in $_.PSObject.Properties)
    {
        doSomething $property.Name, $property.Value
    } 

}

这对我来说跳过了第一行。我在我的csv中没有使用标题,只有一行没有逗号,例如:thing1<NEWLINE>thing2<NEWLINE>等。换句话说,这是一个简单的列表。 - Radmation
@Radmation 导入-CSV $path -Header A 就是你需要的更改。这告诉PowerShell将标题“A”添加到列中,并将每行视为值,而不是认为第一行是标题行。 - Monica Apologists Get Out
1
在处理 CSV 时,使用 ForEach-Object 而不是简单的 ForEach 的重要区别。 - unNamed
1
@unNamed 不,这完全没有关系。 - stackprotector

19

遍历CSV文件的每行每列的稍微另一种方式是:

$path = "d:\scratch\export.csv"
$csv = Import-Csv -path $path

foreach($line in $csv)
{ 
    $properties = $line | Get-Member -MemberType Properties
    for($i=0; $i -lt $properties.Count;$i++)
    {
        $column = $properties[$i]
        $columnvalue = $line | Select -ExpandProperty $column.Name

        # doSomething $column.Name $columnvalue 
        # doSomething $i $columnvalue 
    }
} 

所以你有选择:你可以使用$column.Name来获取列的名称,或者使用$i来获取列的编号。


Get-Member按字母顺序对列进行排序。如果需要保留CSV列的原始顺序,将会丢失它。 - Tony

2
$header3 = @("Field_1","Field_2","Field_3","Field_4","Field_5")     

Import-Csv $fileName -Header $header3 -Delimiter "`t" | select -skip 3 | Foreach-Object {

    $record = $indexName 
    foreach ($property in $_.PSObject.Properties){

        #doSomething $property.Name, $property.Value

            if($property.Name -like '*TextWrittenAsNumber*'){

                $record = $record + "," + '"' + $property.Value + '"' 
            }
            else{
                $record = $record + "," + $property.Value 
            }                           
    }               

        $array.add($record) | out-null  
        #write-host $record                         
}

select -skip 3 是什么意思? - JGFMK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接