How to export a PostgreSQL query output to a csv file

mflowww picture mflowww · Mar 22, 2015 · Viewed 53.3k times · Source

I'm having problem exporting my PostgreSQL output from a shell to a csv file.
My SQL script is called script.sql.

I typed the following command in my shell:

psql congress -af script.sql &> filename.csv

But when I opened the filename.csv file, values of all the columns are squeezed in one column in the Excel csv (see the attached screenshot).

Then I tried another way. I edited my script.sql to be:

Copy (Select * From ...) To '/tmp/filename.csv' With CSV;

Then I typed the following command in the shell within the database dbname.

\i script.sql

The output is:

COPY 162

Well, my output query has 162 rows.

So the 162 rows of my output table have been copied in the shell. How can I paste or move them to a csv file?

Or, if I'm going to use the filename.csv (screenshot is attached), how can I fix the format of that csv/Excel file?

Screenshot of filename.csv

Answer

Erwin Brandstetter picture Erwin Brandstetter · Mar 22, 2015

Modern syntax:

COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);

So the 162 rows of my output table have been copied in the shell. How can I paste or move them to a csv file?

The result is the CSV file. Open it with any spreadsheet program using matching delimiters. Per documentation:

The default is a tab character in text format, a comma in CSV format

Like Patrick commented, you can use the corresponding psql meta command \copy in a similar fashion. It writes (and reads) files local to the client and does not require superuser privileges.

More explanation in these related answers: