Re: Escaping special characters - \r when doing COPY CSV

From: Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>
To: Edwin UY <edwin(dot)uy(at)gmail(dot)com>, Pgsql-admin <pgsql-admin(at)lists(dot)postgresql(dot)org>
Subject: Re: Escaping special characters - \r when doing COPY CSV
Date: 2025-09-04 07:29:35
Message-ID: 8ec53dc7d4508410124a5a6d1442840aa90a8f0c.camel@cybertec.at
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin

On Thu, 2025-09-04 at 18:01 +1200, Edwin UY wrote:
> I don't have access to run copy as this is a RDS database so I can only use \copy.
> I need to send the output to csv.
> One of the fields has a special character = \r. I can see it visually.
>
> Running the \copy below gives me extra row/s because of the \r
> \copy ( select *  from blah  where blah_ref = '666'   order by date_created desc  limit 5; ) to 'abc.csv' WITH CSV DELIMITER ',' HEADER
>
> I have tried this
> \copy ( select *  from blah  where blah_ref = '666'   order by date_created desc  limit 5; ) to 'abc.csv' WITH (FORMAT CSV, HEADER, ESCAPE '\r');
>
> But it gives ERROR:  COPY escape must be a single one-byte character.
>
> Besides using a view for the SQL, as suggested when I do a web search, any chance someone here knows how to do it without using a view?

There is no problem with having the carriage return characters in the CSV output,
but if you'd rather do without them, you could trim them:

\copy (SELECT trim(textcol, E'\u000d'), othercol, ... FROM tab ...) TO ...

In order to include escape sequences into a string literal, you have to prepend
the opening single quote with an "E" for "extended":

E'\r'
E'\x0D'
E'\u000D'
E'\U0000000D'

Yours,
Laurenz Albe

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Edwin UY 2025-09-04 09:39:46 Re: Escaping special characters - \r when doing COPY CSV
Previous Message Edwin UY 2025-09-04 06:01:45 Escaping special characters - \r when doing COPY CSV