2012-08-09 80 views
12

我想在powershell中處理csv文件,但我不知道CSV文件中的列標題在處理時會是什麼。如何從powershell中的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)?

回答

20
Import-Csv $path | Foreach-Object { 

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

} 
+0

謝謝謝謝,這很好地工作。 – simon 2012-08-09 14:22:46

+0

這爲我跳過了第一行。我在我的csv中沒有使用標題,而且只有一行沒有逗號ex:thing1 thing2 等等。換句話說,一個簡單的列表 – Radmation 2017-02-17 21:56:01

7

A到一個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以獲得該列的號碼

0
$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       
} 
相關問題