Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Pisangas en 20 Diciembre 2017, 22:13 pm



Título: Extraer columnas de un csv separado por |
Publicado por: Pisangas en 20 Diciembre 2017, 22:13 pm
Buenas tardes,

alguien me puede colaborar, tengo un archivo csv separado por | del cual solo me interesan algunas columnas, existe alguna manera a traves de un bat de extraer esta data a otro archivo txt.


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Eleкtro en 21 Diciembre 2017, 12:42 pm
alguien me puede colaborar, tengo un archivo csv separado por | del cual solo me interesan algunas columnas, existe alguna manera a traves de un bat de extraer esta data a otro archivo txt.

Desde siempre ha existido el mal hábito, ignorancia o la desinformación de pensar que Batch es un lenguaje de programación, que sirve para todo y que es la mejor solución y la solución más sencilla ante cualquier problema programático... pero NO, ninguna de esas declaraciones es cierta, y mucho menos cuando de trata de llevar a cabo un parsing de datos para parsear un formato específico (una tabla CSV) ya que Batch no provee ninguna funcionalidad built-in para ello, es muy limito e ineficiente, así que tendrías que usar un bucle de tipo For /F para parsear el contenido del texto y delimitar palabras mediante el uso de tokens. Se puede hacer en Batch, por supuesto, pero hacerlo sería muy tedioso (demasiado tiempo de desarrollo en comparación con cualquier otro lenguaje de verdad), y dando como resultado un código engorroso y poco eficiente en ciertos escenarios.

En otras palabras, no vale la pena ni molestarse en intentar hacerlo en Batch habiendo mejores opciones, sí, me estoy refiriendo a PowerShell...

Te explico. Teniendo un CSV con este contenido:

File.csv
Código:
Product|Price|Amount
Broccoli|75|1
Carrots|122|2
Beans|350|3

Puedes usar PowerShell de la siguiente manera para importar una tabla CSV desde un archivo, "extraer" las columnas que quieras, y opcionálmente crear una simple interfáz gráfica con un gridview para mostrar el resultado:

Script.ps1
Código
  1. $csv     = Import-Csv -Path "C:\File.csv" -Delimiter "|" -Encoding "Default"
  2. $columns = ($csv | select "Product","Price")
  3.  
  4. $columns | Out-GridView -PassThru -Title "Title"
  5.  
  6. #$products = ($columns).Product
  7. #ForEach ($product in $products){
  8. #  Write-host $product
  9. #}
  10.  
  11. #$prices = ($columns).Price
  12. #ForEach ($price in $prices){
  13. #  Write-host $price
  14. #}

(https://i.imgur.com/8wZvgRu.png)

PD: las lineas de código comentadas son para demostrarte como puedes hacer una iteración de las celdas de una columna específica.

Saludos.


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Pisangas en 21 Diciembre 2017, 14:22 pm
Parce tenes razón, tal vez ignorancia en el tema, casi no me involucro mucho con estos temas, pero tratare de conocerlo un poco mas, te agradezco profundamente tomes tiempo de tu día en responder las inquietudes, muy agradecido, con lo que me das me arreglas la vida.


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Eleкtro en 21 Diciembre 2017, 14:32 pm
Parce tenes razón, tal vez ignorancia en el tema, casi no me involucro mucho con estos temas, pero tratare de conocerlo un poco mas, te agradezco profundamente tomes tiempo de tu día en responder las inquietudes, muy agradecido, con lo que me das me arreglas la vida.

Ahora has hecho que me sienta mal :P, no sé ya como habrá sonado lo que dije, pero me gustaría aclararlo:

lo de ignorante no lo decia por ti, solo estaba generalizando, quise decir que existe una ignorancia global, por que Batch está sobrevalorado por el 90% de los usuarios informáticos (por decir una cifra aleatoria pero realista), que por un motivo o por otro desconocen el resto de opciones a su alcance (como Powershell), y entonces, sin darse cuenta caen en el "error", por que se empeñan en hacer cosas con Batch para las cuales Batch sencillamente no está capacitado (o en algunos casos si, pero no vale la pena debido al consumo de tiempo y la ineficacia de esa herramienta).

No te lo tomes a mal, no era mi intención llamarte ignorante de forma despectiva ni nada parecido, tampoco me estaba refiriendo a ti. Y la gran mayoria hemos empezado a programar en Windows creyendo que Batch era una buena herramienta de programación, yo incluido.

En fin, espero que el código que te mostré te haya servido, lo puedes ejecutar como si se tratase de un archivo.bat, pero con extensión .ps1.

Un saludo.


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Pisangas en 21 Diciembre 2017, 15:26 pm
Todo bien, para nada, no soy programador, pero como buen ingeniero ante un problema me toca buscar solución.

Reitero mi agradecimiento y no me sentí ofendido para nada, me diste prácticamente la solución al caso.

Ahora bien, te cuento como me fue, me empape un poco de Power Shell y trate de implementar mi solución, luego de sortear una serie de errores pero quedo así

$csv     = Import-Csv -Path "C:\md5\PNN.csv" -Delimiter "|"
$columns = ($csv | select "DATO1","DATO2")
 
$columns | Out-GridView

Quite ciertos parámetros por que a pesar de que existen, el power shell no me los reconocía tales como -ENCODING y -PassThru con esos parámetros me arroja una respuesta "A parameter cannot be found that matches parameter name...."

La verdad no se el por que el mensaje, si en la sintaxis del Power Shell si los encontré.... en fin los elimine, ya puedo tener las columnas que deseo por separado.

Parce Elektro mil gracias.


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Pisangas en 21 Diciembre 2017, 15:50 pm
este Power Shell esta como útil también termine exportandolo a un archivo csv. Con esto solucione mi caso.

gracias.

$csv     = Import-Csv -Path "C:\xx\yy.csv" -Delimiter "|"
$columns = ($csv | select "DATO1","DATO2")
 
$columns | Out-File C:\xx\yy.csv


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Pisangas en 21 Diciembre 2017, 15:53 pm
preferi  export-CSV este me lo envia separado por comas


$csv     = Import-Csv -Path "C:\xx\yy.csv" -Delimiter "|"
$columns = ($csv | select "DATO1","DATO2")
 
$columns | export-CSV C:\xx\yy.csv

Aprendi mucho  :laugh:


Título: Re: Extraer columnas de un csv separado por |
Publicado por: Eleкtro en 21 Diciembre 2017, 18:13 pm
Quite ciertos parámetros por que a pesar de que existen, el power shell no me los reconocía tales como -ENCODING y -PassThru con esos parámetros me arroja una respuesta "A parameter cannot be found that matches parameter name...."

La disponibilidad de algunos parámetros depende de la versión de PowerShell que tengas instalada en tu sistema operativo, ya que en cada nueva versión de Windows viene integrada una versión más reciente de PowerShell con más funcionalidades.

Saludos