J'ai des problèmes pour exporter ma sortie PostgreSQL depuis un shell vers un fichier csv.
Mon script SQL s'appelle script.sql
.
J'ai tapé la commande suivante dans mon shell:
psql congress -af script.sql &> filename.csv
Mais lorsque j'ai ouvert le fichier filename.csv
, les valeurs de toutes les colonnes sont regroupées dans une colonne du fichier Excel CSV (voir la capture d'écran ci-jointe).
Puis j'ai essayé d'une autre manière. J'ai édité mon script.sql
pour être:
Copy (Select * From ...) To '/tmp/filename.csv' With CSV;
Ensuite, j'ai tapé la commande suivante dans le shell de la base de données dbname
.
\i script.sql
La sortie est:
COPY 162
Eh bien, ma requête de sortie a 162 lignes.
Les 162 lignes de ma table de sortie ont donc été copiées dans le shell. Comment puis-je les coller ou les déplacer dans un fichier csv?
Ou, si je veux utiliser le fichier nomfichier.csv (capture d'écran jointe), comment puis-je corriger le format de ce fichier csv/Excel?
Syntaxe moderne:
COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);
Les 162 lignes de ma table de sortie ont donc été copiées dans le shell. Comment puis-je les coller ou les déplacer dans un fichier csv?
Le résultat est le fichier CSV. Ouvrez-le avec n’importe quel tableur utilisant des délimiteurs correspondants. Par documentation:
La valeur par défaut est un caractère de tabulation au format texte, une virgule au format CSV
Comme commenté Patrick , vous pouvez utiliser la méta-commande psql correspondante \copy
de la même manière. Il écrit (et lit) les fichiers locaux sur le client et ne nécessite pas de privilèges de superutilisateur.
Plus d'explications dans ces réponses connexes:
copiez d’abord vos informations de connexion dans ~/.pgpass et
cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz
En partant un peu tangente, il existe aussi un autre moyen.
J'utilise les éléments suivants dans un script batch Windows: -
psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema = '%qSchema%';"
L'astuce consiste à retenir l'option -A. Il supprime les espaces de remplissage des données.
Je le fais pour éviter les erreurs d’autorisation de la commande COPY indiquée ci-dessus. Le compte qui exécute postgress n’a pas les mêmes autorisations que le compte qui exécute mon fichier de commandes planifié.
Cela me donne une liste de tables dans un schéma donné avec des résultats comme: -
myschema | mytable1
myschema | mytable2
J'utilise ensuite la commande FOR batch pour traiter chaque ligne. Si vous voulez VRAIMENT un fichier CSV, tout ce que vous devez faire est le suivant: -
ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv
Probablement pas le plus efficace des mécanismes, mais fonctionne très bien sur un petit nombre de lignes de sortie.