Trabajando con ficheros CSV

Exportar reportes o tablas de datos a CSV (para trabajar a su vez después en Excel por ejemplo) es una operación muy común, en PS tenemos el cmdlet Export-Csv, el cmdlet recibe de una tubería (pipe) y procesa las propiedades de los objetos pasados y genera un fichero CSV de salida en línea sucesivas.

Un ejemplo muy sencillo, obtenemos los procesos en ejecución y los guardamos en un fichero en la misma ruta de ejecución del script:

PS> Get-Process | Export-Csv -Path "processes.csv"

El siguiente ejemplo es más avanzado, filtramos las propiedades del objeto que queremos exportar a CSV con Select-Object y el parámetro -Property:

PS> dir C:\ | Select-Object -Property Name,Length | Export-Csv C:\temp\FileList.csv
PS> Get-Content C:\temp\FileList.csv

Podemos abrir facilmente el fichero en Excel (o el programa que tengamos configurado como predeterminado para esa tipo de archivos) con el siguiente comando:

PS> Invoke-Item C:\temp\FileList.csv

Importar desde un CSV

Get-Content lee el contenido del fichero interpretandolo como cadenas de texto, si queremos trabajar con colecciones de registros usaremos Import-CSV, facilmente podemos volcarlo a una variable y recorrer su contenido.

PS> $MyFileList = Import-CSV C:\temp\FileList.csv
PS> $MyFileList
PS> $MyFileList | Get-Member
PS> ForEach ($Item in $MyFileList) {"Name:"+$Item.("Name") }
PS> ForEach ($Item in $MyFileList) {"Name:"+$Item.("Length") }

O acceder a cada objeto del resultado por su índice:

PS> Write-Host $MyFileList[0].Name 

Importar como objetos [casting propiedades]

Fuente: Import-CSV-Obj.ps1

dir C:\ | Select-Object -Property Name,Length | Export-Csv .\FileList.csv

$MyFileList = Import-CSV C:\temp\FileList.csv

$MyFileList | ForEach-Object {
    #Cast properties
    $_Name = [string]$_.Name    
    $_Lenght = [int]$_.Length
    # Escribir objeto
    $_
} 

Enlaces externos