2012-08-09 11 views
12

Quiero procesar un archivo csv en powershell, pero no sé cuáles serán los encabezados de columna en el archivo CSV cuando se procese.cómo recorro una línea desde un archivo csv en powershell

Por ejemplo:

$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) 
    } 

} 

Cómo hacer yo bucle a través de la línea en el archivo csv, recibiendo el nombre de la columna y el valor? ¿O hay otra forma en que debería estar haciendo esto (como no usar Import-csv)?

Respuesta

20
Import-Csv $path | Foreach-Object { 

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

} 
+0

Gracias Shay, que funciona perfectamente. – simon

+0

Esto saltó la primera línea para mí. No estoy usando encabezados en mi csv y solo tengo una fila sin comas ex: thing1 thing2 ect .. En otras palabras, una lista simple – Radmation

7

Un poco otra forma de iteración a través de cada columna de cada línea de un archivo CSV sería

$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 
    } 
} 

por lo que tienen la elección: puede utilizar cualquiera $column.Name para obtener el nombre de la columna o $i para obtener el número de la columna

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       
} 
Cuestiones relacionadas