Powershell duda!

Iniciado por Ur1cchio, 2 Septiembre 2015, 22:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Ur1cchio

Hola que tal! Hace poco empece a usar powershell, y he estado trabado sobre este ejercicio bastante tiempo

-----------------------------------------------------------------------------------------------
Un sistema realiza un backup de su base de datos en un archivo de texto plano con el siguiente formato:

Campo1=Valor1
Campo2=Valor2
Campo3=Valor3
***
Campo1=Valor4
Campo2=Valor5
Campo3=Valor6

Cada línea contiene el valor de un campo para un registro. Cada registro se encuentra separado del otro por 3 asteriscos.
Se necesita crear un script que lea el archivo de backup y genere un archivo CSV para poder procesarlo más fácilmente. La primer fila del archivo CSV contener los nombres de los campos, y en las filas siguientes estarán los valores de los mismos.

Obligatoriamente necesito usar el cmd Export-Csv

----------------------------------------------------------------------------------------------

Claramente no puedo agarrar directamente el archivo de texto y exportarlo a CSV.
Mi problema es tratar de leer el archivo de txt y empezar a darle forma de tabla o algo asi.

He intentado creando una tabla, pero se me complica demasiado agregar los datos a cada columna, ya que este tipo de estructura solamente me deja referenciar a una colmna solo por su nombre, y no por algun tipo de indice o algo.
Ayuda porfavor, algun consejo o tip, no quiero que me hagan el ejercicio

Desde ya muchas gracias
Saludos cordiales

Ur1cchio

Al final logre resolver el problema, o casi todo! faltan unos pequeños detalles nomas...
Lo subo por si algún día en el futuro alguien lo necesita

CitarParam(
    [Parameter( Position = 1, Mandatory = $true )][String]$pathEntrada = ( Read-Host "Ingrese path de entrada " ),
    [Parameter( Position = 2, Mandatory = $false )][String]$pathSalida = ( Read-Host "Ingrese path de salida " )
)

$tabla = New-Object System.Data.DataTable "tabla"
$contenido = Get-Content $pathEntrada#

#creamos las columnas
#A las columnas les pongo el nombre que les corresponde con $linea[0]
$i = 0
while(  !$contenido[$i].Contains("***")  ){
    $linea = ($contenido[$i]).Split("=")
    write-host "contiene" + $linea[0]
    $col = New-Object system.Data.DataColumn $linea[0],([String])
    $tabla.Columns.Add($col)
    $i++
}

#en la variable i vamos a tener la cantidad de columnas
#empezamos a buscar los registros
$j = 0
foreach( $linea2 in $contenido ){
    #Si encuentro un *** y j = 0 entonces creo una nueva fila
    if(($j -eq 0) ){
        write-host "se creo la fila "
        $row = $tabla.NewRow()
       
    }
    # si j es menor que la cantidad de columnas o igual
    #agrego a esa fila en la columna $linea2[0] el valor $linea2[1]
    if( $j -lt $i ){
        $j++
        $linea2 = $linea2.Split("=")
        write-host $linea2[0]
        $row.($linea2[0]) = $linea2[1]
    #una vez que j = a la cantidad de columnas es por que complete
    #todas las columnas, por lo tanto agregamos la fila a la tabla
    #e inicializamos nuevamente J
    }else{
        $tabla.Rows.Add($row)
        $j = 0
    }
}



$tabla | Export-csv -Path $pathSalida