web-dev-qa-db-fra.com

Copier quelques colonnes d'un fichier csv dans une table

J'ai un fichier CSV avec 10 colonnes. Après avoir créé une table PostgreSQL avec 4 colonnes, je souhaite copier certaines des 10 colonnes dans la table.

les colonnes de ma table CSV sont comme:

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10

les colonnes de ma table PostgreSQL devraient ressembler à ceci:

x2 x5 x7 x10
39
POTENZA

S'il s'agit d'une tâche ad hoc

Créer une table temporaire avec toutes les colonnes du fichier d'entrée

create temporary table t (x1 integer, ... , x10 text)

Copier du fichier dans le fichier:

copy t (x1, ... , x10)
from '/path/to/my_file'
with (format csv)

Maintenant, insérez dans la table définitive à partir de la temp:

insert into my_table (x2, x5, x7, x10)
select x2, x5, x7, x10
from t

Et laissez tomber:

drop table t

Si c'est une tâche fréquente

Utilisez l’extension file_fdw . En tant que superutilisateur:

create extension file_fdw;

create server my_csv foreign data wrapper file_fdw;

create foreign table my_csv (
    x1 integer,
    x2 text,
    x3 text
) server my_csv
options (filename '/tmp/my_csv.csv', format 'csv' )
;

Accordez l'autorisation de sélection sur la table à l'utilisateur qui la lira:

grant select on table my_csv to the_read_user;

Ensuite, chaque fois que nécessaire, lisez directement à partir du fichier csv comme s'il s'agissait d'une table:

insert into my_table (x2)
select x2
from my_csv
where x1 = 2
56
Clodoaldo Neto

Vous pouvez fournir les colonnes que vous voulez remplir avec la commande COPY. Ainsi:

\copy your_table (x2,x5,x7,x10) FROM '/path/to/your-file.csv' DELIMITER ',' CSV;

Voici le doc pour la commande COPY.

26
Julien

Nous venons d’arriver ici à la recherche d’une solution permettant de charger uniquement un sous-ensemble de colonnes, mais ce n’est apparemment pas possible. Utilisez donc awk (ou cut) pour extraire les colonnes souhaitées dans un nouveau fichier new_file:

$ awk '{print $2, $5, $7, $10}' file > new_file

et chargez le new_file. Vous pouvez diriger la sortie directement vers psql:

$ cut -d \  -f 2,5,7,10 file | 
  psql -h Host -U user -c "\COPY table(col1,col2,col3,col4) FROM STDIN DELIMITER ' '" database
5
James Brown

Vous pouvez aller plus loin dans la suggestion de James Brown:

cat file | awk -F ',' '{print $ 2 "," $ 5 "," $ 7 "," $ 10}' '| psql -d db -c "\ copie MyTable de l'en-tête csv STDIN"

0
Chris Lawton

Pour charger des données depuis une feuille de calcul (Excel ou OpenOffice Calc) dans postgreSQL:

Enregistrez la page de la feuille de calcul en tant que fichier CSV. La méthode préférée consiste à ouvrir la feuille de calcul sur OpenOffice Calc et à enregistrer. Dans la fenêtre “Exporter vers un fichier texte”, choisissez Jeu de caractères comme Unicode (UTF8), Délimiteur de champ: “,” et délimiteur de texte ““ “. Le message sera affiché indiquant que seule la feuille active est enregistrée. Remarque: Ce fichier doit être enregistré dans un dossier mais pas sur le bureau et doit être enregistré au format UTF8 (postgreSQL by dafault est un accélérateur du codage UTF8). Si elle est enregistrée sur le bureau, postgreSQL donnera le message «Accès refusé» et ne téléchargera pas.

Dans PostgreSQL, créez une table vide avec le même nombre de colonnes que la feuille de calcul.

Remarque: sur chaque colonne, nom-colonne doit être identique, le type de données doit être identique. Aussi, gardez à l'esprit la longueur des données où le caractère varie avec suffisamment de champ.

Puis sur postgreSQL, sur une fenêtre SQL, mettez le code: 

copie "ABC". "def" de E'C: \\ tmp \\ blabla.csv 'délimiteurs', 'CSV HEADER;

REMARQUE: C: \\ tmp est le dossier dans lequel le fichier CSV «blabla» est enregistré. "ABC". "Def" est la table créée sur postgreSQL où "ABC" est le schéma et "def" est la table réelle. Ensuite, faites "exécuter la requête" en appuyant sur le bouton vert en haut. «CSV HEADER» est nécessaire lorsque la table CSV a un en-tête au début de chaque colonne.

Si everythig est ok, aucun message d'erreur ne sera affiché et les données de la table d'un fichier CSV seront chargées dans la table postgreSQL. Mais s'il y a un message d'erreur, procédez comme suit:

Si le message d'erreur indique que les données sont trop longues pour une colonne spécifique, augmentez la taille de la colonne. Cela se produit principalement sur des caractères et des colonnes de caractères différents. Ensuite, exécutez à nouveau la commande "Exécuter la requête".

Si le message d'erreur indique que le type de données ne correspond pas à une colonne particulière, modifiez le type de données de la colonne table postgreSQL pour qu'il corresponde à celui de la table CSV.

Dans votre cas, après avoir créé le fichier CSV, supprimez les colonnes indésirables et faites correspondre les colonnes de la table postgre.

0
Sagun