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