PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

COPIER uniquement certaines colonnes d'un CSV d'entrée ?

Je ne sais pas où vous avez trouvé cette syntaxe, mais COPY ne prend pas une liste d'alias de colonne comme ça. Voir l'aide :

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

(AS n'est pas l'une des options répertoriées ; pour voir la sortie complète, lancez \d copy en psql, ou regardez le manuel pour la copy commande en ligne).

Il n'y a pas de fonction de mappage dans COPY qui vous permet de lire uniquement certaines colonnes du CSV d'entrée. Ce serait vraiment utile, mais personne n'a encore eu le temps/l'intérêt/le financement pour le mettre en œuvre. Ce n'est vraiment qu'une des nombreuses tâches de transformation/filtrage de données que les gens veulent de toute façon.

PostgreSQL attend la liste de colonnes donnée dans COPY être dans le même ordre, de gauche à droite, que ce qui se trouve dans le fichier CSV, et avoir le même nombre d'entrées que le fichier CSV a de colonnes. Donc, si vous écrivez :

COPY con (date,kgs)

alors PostgreSQL attendra un CSV d'entrée avec exactement deux colonnes . Il utilisera la première colonne csv pour la "date" colonne du tableau et la deuxième colonne csv pour le "kgs" colonne du tableau. Peu importe les en-têtes CSV, ils sont ignorés si vous spécifiez WITH (FORMAT CSV, HEADER ON) , ou traitées comme des lignes de données normales si vous ne spécifiez pas HEADER .

PostgreSQL 9.4 ajoute FROM PROGRAM à COPY , vous pouvez donc exécuter une commande shell pour lire le fichier et le filtrer. Un simple script Python ou Perl ferait l'affaire.

S'il s'agit d'un petit fichier, ouvrez simplement une copie dans la feuille de calcul de votre choix sous forme de fichier csv, supprimez les colonnes indésirables et enregistrez-le, donc uniquement la date et kgs les colonnes restent.

Alternativement, COPY à une table intermédiaire qui a toutes les mêmes colonnes que le CSV , puis faites un INSERT INTO ... SELECT pour transférer uniquement les données souhaitées dans la vraie table cible.