Importando datos SQL con Perl

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";

  • Tehsis

    Acertados tus correcciones…

    no se que habré querido hacer con esa primer linea xD, insisto en que arme el script en 10 minutos durante una clase para safar :P

    Gracias por las correcciones, más tarde las subo

  • Also, para cuando hacés scripts chicos, o snippets de código que se lean de un pantallazo, crear un repo es un poquito overkill. Github te da gist, que es justamente para eso:

    https://gist.github.com/710449

  • Tehsis

    Mira vos, no conocía eso. Thanks again