Formating psql query output

Started by Rich Shepardover 4 years ago17 messagesgeneral
Jump to latest
#1Rich Shepard
rshepard@appl-ecosys.com

Until I finish building the python/tkinter/psycopg2 front end to my business
tracking tool I continue to work using the psql shell.'

I have a working .sql script that reports my contacts between two dates; the
script returns more columns than I want included in the report. I want to
pipe the output through an awk script to extract, in order, the columns I
need. I'm stuck at the point of defining options to psql.

The current command line is:
psql -d bustrac -f prospecting_log.sql -o contacts.txt --csv

However, using the --csv output conversion makes separate fields from a
varchar column that can contain commas with the text contents.

Without --csv I get normal psql output with column headings and separator
lines such as these:
person_nbr | act_date | act_type | notes | person_nbr | lname | fname | org_nbr | org_nbr | org_name
------------+------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+------------------+------------+---------+---------+----------------------

Is there an option that will retain the '|' separator but exclude the
headings? Reading the psql document page I don't see such an option.

TIA,

Rich

#2Basques, Bob (CI-StPaul)
bob.basques@ci.stpaul.mn.us
In reply to: Rich Shepard (#1)
RE: Formating psql query output

From here: https://www.postgresql.org/docs/9.2/app-psql.html

-F separator
--field-separator=separator
Use separator as the field separator for unaligned output. This is equivalent to \pset fieldsep or \f.

Bobb

Show quoted text

-----Original Message-----
From: Rich Shepard <rshepard@appl-ecosys.com>
Sent: Monday, July 19, 2021 12:33 PM
To: pgsql-general@lists.postgresql.org
Subject: Formating psql query output

Think Before You Click: This email originated outside our organization.

Until I finish building the python/tkinter/psycopg2 front end to my business
tracking tool I continue to work using the psql shell.'

I have a working .sql script that reports my contacts between two dates; the
script returns more columns than I want included in the report. I want to pipe
the output through an awk script to extract, in order, the columns I need. I'm
stuck at the point of defining options to psql.

The current command line is:
psql -d bustrac -f prospecting_log.sql -o contacts.txt --csv

However, using the --csv output conversion makes separate fields from a
varchar column that can contain commas with the text contents.

Without --csv I get normal psql output with column headings and separator
lines such as these:
person_nbr | act_date | act_type |
notes
| person_nbr | lname | fname | org_nbr | org_nbr | org_name
------------+------------+-----------+------------------------------------------------------
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
---------------------------------+------------+------------------+------------+---------+--
-------+----------------------

Is there an option that will retain the '|' separator but exclude the headings?
Reading the psql document page I don't see such an option.

TIA,

Rich

#3David Santamauro
david.santamauro@gmail.com
In reply to: Rich Shepard (#1)
Re: Formating psql query output

From: Rich Shepard <rshepard@appl-ecosys.com>
Date: Monday, July 19, 2021 at 1:33 PM

Is there an option that will retain the '|' separator but exclude the headings?
Reading the psql document page I don't see such an option.

echo 'select 1,2,3,4;' | psql -At -F'|'

1|2|3|4

-A Switches to unaligned output mode. (The default output mode is aligned.) This is equivalent to \pset format unaligned.
-t Turn off printing of column names and result row count footers, etc. This is equivalent to \t or \pset tuples_only.
-F Use separator as the field separator for unaligned output. This is equivalent to \pset fieldsep or \f.

HTH

#4Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Rich Shepard (#1)
Re: Formating psql query output

On 7/19/21 10:33 AM, Rich Shepard wrote:

Until I finish building the python/tkinter/psycopg2 front end to my
business
tracking tool I continue to work using the psql shell.'

I have a working .sql script that reports my contacts between two dates;
the
script returns more columns than I want included in the report. I want to
pipe the output through an awk script to extract, in order, the columns I
need. I'm stuck at the point of defining options to psql.

Is there a reason you can't just restrict the query to the columns you want?

TIA,

Rich

--
Adrian Klaver
adrian.klaver@aklaver.com

#5Rob Sargent
robjsargent@gmail.com
In reply to: Adrian Klaver (#4)
Re: Formating psql query output

On Jul 19, 2021, at 11:49 AM, Adrian Klaver <adrian.klaver@aklaver.com> wrote:

On 7/19/21 10:33 AM, Rich Shepard wrote:

Until I finish building the python/tkinter/psycopg2 front end to my business
tracking tool I continue to work using the psql shell.'
I have a working .sql script that reports my contacts between two dates; the
script returns more columns than I want included in the report. I want to
pipe the output through an awk script to extract, in order, the columns I
need. I'm stuck at the point of defining options to psql.

Is there a reason you can't just restrict the query to the columns you want?

Also had that thought but OP is wise to head the other switches for cleaner output. But also should probably get familiar with to-json options as well for easy pickup on the eventual client.

#6Rich Shepard
rshepard@appl-ecosys.com
In reply to: Basques, Bob (CI-StPaul) (#2)
RE: Formating psql query output

On Mon, 19 Jul 2021, Basques, Bob (CI-StPaul) wrote:

-F separator
--field-separator=separator
Use separator as the field separator for unaligned output. This is equivalent to \pset fieldsep or \f.

Bobb,

I should have mentioned that I tried that. Without the --csv option the results
have the headings and separator. With --csv the field separator is ignored
regardless of postion within the command string.

Thanks,

Rich

#7Rich Shepard
rshepard@appl-ecosys.com
In reply to: David Santamauro (#3)
Re: Formating psql query output [RESOLVED]

On Mon, 19 Jul 2021, David Santamauro wrote:

echo 'select 1,2,3,4;' | psql -At -F'|'
1|2|3|4

-A Switches to unaligned output mode. (The default output mode is aligned.) This is equivalent to \pset format unaligned.
-t Turn off printing of column names and result row count footers, etc. This is equivalent to \t or \pset tuples_only.
-F Use separator as the field separator for unaligned output. This is equivalent to \pset fieldsep or \f.

David,

HTH

Sure enough, it does. And I learned more on using psql options.

Thank you very much,

Rich

#8Rich Shepard
rshepard@appl-ecosys.com
In reply to: Adrian Klaver (#4)
Re: Formating psql query output

On Mon, 19 Jul 2021, Adrian Klaver wrote:

Is there a reason you can't just restrict the query to the columns you want?

Adrian,

As far as I know I need to specify FK and PK columns when tables are joined;
I don't need those key columns in the output.

Thanks,

Rich

#9Rob Sargent
robjsargent@gmail.com
In reply to: Rich Shepard (#6)
Re: Formating psql query output

On Jul 19, 2021, at 12:53 PM, Rich Shepard <rshepard@appl-ecosys.com> wrote:

On Mon, 19 Jul 2021, Basques, Bob (CI-StPaul) wrote:

-F separator
--field-separator=separator
Use separator as the field separator for unaligned output. This is equivalent to \pset fieldsep or \f.

Bobb,

I should have mentioned that I tried that. Without the --csv option the results
have the headings and separator. With --csv the field separator is ignored
regardless of postion within the command string.

Can we see on line of the csv output? The field with commas should be in quotes, no? You’ll have write a “real” csv importer. awk =F”\”*,*\”” might, heavy on the might.

#10Rich Shepard
rshepard@appl-ecosys.com
In reply to: Rob Sargent (#9)
Re: Formating psql query output

On Mon, 19 Jul 2021, Rob Sargent wrote:

Can we see on line of the csv output? The field with commas should be in
quotes, no? You’ll have write a “real” csv importer. awk =F”\”*,*\””
might, heavy on the might.

Rob,

Here's a redacted output line:

8,2019-04-08,Phone,Went to voice mail @ 14:48; didn't leave a message. Call
Wednesday morning,8,<lname>,<fname>,537,537,<company_name>

No quoted text fields.

Rich

#11Rob Sargent
robjsargent@gmail.com
In reply to: Rich Shepard (#10)
Re: Formating psql query output

On Jul 19, 2021, at 1:07 PM, Rich Shepard <rshepard@appl-ecosys.com> wrote:

On Mon, 19 Jul 2021, Rob Sargent wrote:

Can we see on line of the csv output? The field with commas should be in
quotes, no? You’ll have write a “real” csv importer. awk =F”\”*,*\””
might, heavy on the might.

Rob,

Here's a redacted output line:

8,2019-04-08,Phone,Went to voice mail @ 14:48; didn't leave a message. Call
Wednesday morning,8,<lname>,<fname>,537,537,<company_name>

No quoted text fields.

Rich

Postgres version?

Show quoted text
#12Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Rich Shepard (#8)
Re: Formating psql query output

On 7/19/21 11:58 AM, Rich Shepard wrote:

On Mon, 19 Jul 2021, Adrian Klaver wrote:

Is there a reason you can't just restrict the query to the columns you
want?

Adrian,

As far as I know I need to specify FK and PK columns when tables are
joined;

You need them in the JOIN and/or WHERE sections, but not necessarily in
the field list in the SELECT portion.

I don't need those key columns in the output.

Thanks,

Rich

--
Adrian Klaver
adrian.klaver@aklaver.com

#13Pavel Stehule
pavel.stehule@gmail.com
In reply to: Rich Shepard (#10)
Re: Formating psql query output

po 19. 7. 2021 v 21:07 odesílatel Rich Shepard <rshepard@appl-ecosys.com>
napsal:

On Mon, 19 Jul 2021, Rob Sargent wrote:

Can we see on line of the csv output? The field with commas should be in
quotes, no? You’ll have write a “real” csv importer. awk =F”\”*,*\””
might, heavy on the might.

Rob,

Here's a redacted output line:

8,2019-04-08,Phone,Went to voice mail @ 14:48; didn't leave a message. Call
Wednesday morning,8,<lname>,<fname>,537,537,<company_name>

No quoted text fields.

text fields are quoted only when it is necessary

[pavel@localhost src]$ psql -c "select 'ahoj' as x, 'svete' as y" --csv
Assertions: on
x,y
ahoj,svete
[pavel@localhost src]$ psql -c "select 'ahoj' as x, 'sve,te' as y" --csv
Assertions: on
x,y
ahoj,"sve,te"

If you need forced quoting, you need to use COPY TO STDOUT statement

Regards

Pavel

Show quoted text

Rich

#14Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#13)
Re: Formating psql query output

po 19. 7. 2021 v 21:12 odesílatel Pavel Stehule <pavel.stehule@gmail.com>
napsal:

po 19. 7. 2021 v 21:07 odesílatel Rich Shepard <rshepard@appl-ecosys.com>
napsal:

On Mon, 19 Jul 2021, Rob Sargent wrote:

Can we see on line of the csv output? The field with commas should be in
quotes, no? You’ll have write a “real” csv importer. awk =F”\”*,*\””
might, heavy on the might.

Rob,

Here's a redacted output line:

8,2019-04-08,Phone,Went to voice mail @ 14:48; didn't leave a message.
Call
Wednesday morning,8,<lname>,<fname>,537,537,<company_name>

No quoted text fields.

text fields are quoted only when it is necessary

[pavel@localhost src]$ psql -c "select 'ahoj' as x, 'svete' as y" --csv
Assertions: on
x,y
ahoj,svete
[pavel@localhost src]$ psql -c "select 'ahoj' as x, 'sve,te' as y" --csv
Assertions: on
x,y
ahoj,"sve,te"

If you need forced quoting, you need to use COPY TO STDOUT statement

[pavel@localhost src]$ psql -c "copy (select 'ahoj' as x, 'svete' as y) to
stdout force quote * csv header"
Assertions: on
x,y
"ahoj","svete"

Show quoted text

Regards

Pavel

Rich

#15Rich Shepard
rshepard@appl-ecosys.com
In reply to: Rob Sargent (#11)
Re: Formating psql query output

On Mon, 19 Jul 2021, Rob Sargent wrote:

Postgres version?

postgresql-12.7-x86_64-1_SBo

#16Rich Shepard
rshepard@appl-ecosys.com
In reply to: Adrian Klaver (#12)
Re: Formating psql query output

On Mon, 19 Jul 2021, Adrian Klaver wrote:

You need them in the JOIN and/or WHERE sections, but not necessarily in the
field list in the SELECT portion.

Adrian,

I wondered about that and thought I needed to include them in the SELECT
phrase.

Thanks for the lesson.

Regards,

Rich

#17Ron
ronljohnsonjr@gmail.com
In reply to: Rich Shepard (#16)
Re: Formating psql query output

On 7/19/21 3:05 PM, Rich Shepard wrote:

On Mon, 19 Jul 2021, Adrian Klaver wrote:

You need them in the JOIN and/or WHERE sections, but not necessarily in
the field list in the SELECT portion.

Adrian,

I wondered about that and thought I needed to include them in the SELECT
phrase.

If that were the case, then there would be no purpose in enumerating columns
instead of writing "SELECT T1.*, T2.*"

--
Angular momentum makes the world go 'round.