Hace algun tiempo tenia que importar CSV a una tabla que tenia guardada en una base de datos Postgre para una materia de la escuela.
Como tenia un problema con la forma oficial para hacer esto y no funcionaba internet, con la ayuda de Perl arme un pequeño script que, leyendo desde un archivo CSV, generaba sentencias “insert” con los datos para luego pegarlos en una consola y de esa forma tener mís datos importados… como quien dice, una “rebuscada freak”
En fin, el código pueden verlo a continuación o bien desde mí cuenta de gitHub en: https://github.com/tehsis/importSQL
EDIT: Debido a que el script fue sufriendo algunos cambios desde que lo publique, dejo solo el link al repo
Recomendaciones:
1) Explotá la filosofía de streams de *NIX: no pidas archivos para leer y escribir; leé de stdin y escribí en stdout.
2) Si vas a parsear a mano el csv (cosa que es mala por la forma en que se manejan las comillas), usá “split(/\s*,\s*/)”, así no tenés espacios extra.
3) El primer join/split que hacés da exactamente lo mismo que si no hubieras hecho ninguno.
4) Usá chomp para sacar los espacios y \n que sobran.
5) Combiná todos los inserts en uno solo, pasando values nuevos.
#!/usr/bin/env perl
use warnings;
use strict;
# Read the first parameter: tablename.
my $tablename = shift;
# The first line holds the names of the fields.
my $fields = ;
chomp $fields;
print "INSERT INTO $tablename ($fields) values";
my $firstline = 1;
# The rest of the VALUE groups are comma-separated.
while () {
chomp;
if ($firstline) {
# The first insert is special-cased to avoid a trailing comma.
print "\n";
$firstline = 0;
} else {
print ",\n";
}
print "('" . join ("','", split(/\s*,\s*/)) . "')";
}
print ";\n";