2012-08-09 26 views
12

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ファイルのラインを通じてIループしていますか?あるいは、私がこれをやっていなければならない別の方法があります(Import-csvを使わないのと同じですか?)

答えて

20
Import-Csv $path | Foreach-Object { 

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

} 
+0

ありがとうシェイ、それは完全に動作します。 – simon

+0

これは私のための最初の行をスキップしました。私はCSVでヘッダーを使用していません。また、カンマなしの行が1つしかありません。thing1 thing2 ect ..つまり単純なリスト – Radmation

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       
} 
関連する問題