Eliminar lineas de archivo CSV por criterio

Aldrin Martoq amartoq en dcc.uchile.cl
Mie Feb 2 17:56:56 CLST 2011


On Feb 2, 2011, at 3:00 PM, Rodrigo Ruiz Fuentes wrote:
> la situación es la siguiente, tengo un archivo grande en formato CSV, separado por puntos y comas (;) y delimitado por comillas dobles ("), en los campos 4 y 5 vienen latitudes y longitudes respectivamente, a veces el dato viene mal y vacío, o sea ""... necesito revisar el archivo y eliminar las lineas que en el campo 4 y 5 sean "" (vacías).
> Me indicaron que con sed podía hacer eso, algo logré, sin embargo hay mas campos que si pueden ser vacíos, pero no se debe eliminar la línea completa, entonces ahí es el problema, no sé como indicar que verifique la posición 4 y 5 solamente.
> Mis conocimientos en expresiones regulares y sed son limitados, por no decir nulos, si alguien me da una mano, se agradecerá mucho.

Todo eso es tan de la vieja escuela... acá una solución en ruby 1.9 que tu mismo puedes entender y modificar a gusto:

----- ini -- procesar.rb ------
#!/usr/bin/ruby1.9.1

require 'csv'

CSV.open('resultado.csv', 'wb', :col_sep => ';', :force_quotes => true) do |out|
  CSV.foreach('prueba.csv', :col_sep => ';') do |fila|
    if fila[3] == "" or fila[4] == ""
      puts 'Ignorando fila: ' + fila.to_s
    else
      out << fila
    end
  end
end
----- procesar.rb -- fin ------

----- ini -- procesar.rb ------
"HOLA";"1";"ESTAS TÚ?";"";""
"HOLA";"2";"ESTAS TÚ?";"a";""
"HOLA";"3";"ESTAS TÚ?";"";"b"
"HOLA";"4";"ESTAS TÚ?";"c";"d"
"HOLA";"5";"ESTAS TÚ?";"";""
"HOLA";"6";"ESTAS TÚ?";"e";"f"
----- prueba.csv -- fin ------


ejecución:
$ sudo apt-get install ruby1.9.1
$ chmod a+x procesar.rb
$ ./procesar.rb


Mas info en http://www.ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html ... Bueno, quedó en bandeja de plata ¿Qué premio ganamos? ;)



Aldrin Martoq
http://aldrin.martoq.cl/







Más información sobre la lista de distribución Linux