Re: Import from CSV error - Mailing list pgsql-novice

From David Johnston
Subject Re: Import from CSV error
Date
Msg-id 1383157105585-5776424.post@n5.nabble.com
Whole thread Raw
In response to Re: Import from CSV error  (Steve Crawford <scrawford@pinpointresearch.com>)
Responses Re: Import from CSV error  (James David Smith <james.david.smith@gmail.com>)
List pgsql-novice
Steve Crawford wrote
>> COPY temp FROM 'C:/Program Files/PostgreSQL/9.2/data/tube_o_r.txt'
>> DELIMITER ';';
>>
>> ERROR:  parse error - invalid geometry
>> HINT:  "ST" <-- parse error at position 2 within geometry
>> CONTEXT:  COPY temp, line 1, column the_geom:
>> "ST_GeomFromText('LINESTRING(-0.11453 51.50366,-0.11450
>> 51.50369,-0.11422 51.50404,-0.11392 51.50397,..."
>>
>> My file is a txt file, with no headers, with the two columns separated
>> by a semi-colon. Line one of the file is shown below:
>>
>> 1;ST_GeomFromText('LINESTRING(-0.11453 51.50366,-0.11450
>> 51.50369,-0.11422 51.50404,-0.11392 51.50397,-0.11367
>
> Since this has gone unanswered for a couple days I'll venture a _guess_
> based on little (~0) experience with PostGIS.
>
> I *suspect* that the input file should only have the Well Known Text
> (WKT) representation of the linestring and should not have the
> ST_GeomFromText constructor function as part of the input.
>
> Geogeeks? Is this right or wrong?

This is not PostGIS specific.  COPY does not allow for anything other than
implicit casting to occur against the input data.  Because of this the
supplied data in the file has to be considered "raw" input data that will be
directly copied to the table without alteration.

If you really need to have the database engine process the input data you
will have to construct an SQL insert statement and execute that directly.

INSERT INTO temp (id, the_geom)
VALUES
(1, ST_GeomFromText('......'),
(2, ST_GeomFromText('......'),
(3, ST_GeomFromText('......')
;

The only way to make a COPY work is if the data in the column could
correctly be processed if written as:

'..data..'::geometry --(or whatever would be correct PostGIS syntax for
this).  This is a PostGIS question that I cannot answer.

The INSERT INTO ... VALUES is actually pretty well performing as long as you
avoid repeating INSERT for every record.  If that is not possible/desireable
you get only slightly less-bad performance by using a transaction:

BEGIN;
INSERT INTO ...;
INSERT INTO ...;
INSERT INTO ...;
COMMIT;

There is more parsing involved this way but you avoid the WAL/checkpoint hit
that you'd encounter without the transaction.

David J.





--
View this message in context: http://postgresql.1045698.n5.nabble.com/Import-from-CSV-error-tp5776075p5776424.html
Sent from the PostgreSQL - novice mailing list archive at Nabble.com.


pgsql-novice by date:

Previous
From: Steve Crawford
Date:
Subject: Re: Import from CSV error
Next
From: Amol Bhangdiya
Date:
Subject: Re: Double Free or corruption