Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 01 May 2020 19:46

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

[PostGreSQL] [PSQL] Format date (TimeStamps) dans un import via COPY

Bonjour à tous,

J'importe dans une table PostGre, via PSQL, des données issues d'un fichier texte, tabulé.
Il y a une colonne au format date, sous cette forme "AAAA:MM:JJ HH:mm:ss" (ex. : 2020:04:10 21:13:26).
Pour l'instant, je n'ai pas trouvé mieux que de les importer en format texte.

Je créé d'abord ma table :

Code:

psql -h localhost -U postgres -d phototheque -c "CREATE TABLE photos.photos_total (Directory text, filename text, DateTimeOriginal text, model text, GPSLatitude numeric, GPSLongitude numeric);"

Ensuite, j'importe les données avec :

Code:

psql -h localhost -U postgres -d phototheque -c "COPY photos.dbphotos FROM 'M:\Photos\dbphotos.txt' NULL '-' ENCODING 'UTF-8';"

(le fichier texte n'a pas d'entête)

Pensez-vous qu'il soit possible d'importer directement les données au format Time Stamps ?


Sylvain M.

Hors ligne

 

#2 Fri 01 May 2020 20:23

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: [PostGreSQL] [PSQL] Format date (TimeStamps) dans un import via COPY

Je n'ai pas précisé, mais voici comment je convertie ensuite le champ en timestamp :

Code:

to_timestamp(datetimeoriginal,'YYYY:MM:DD HH24:MI') as monchampdate

Dernière modification par Sylvain M. (Fri 01 May 2020 23:07)


Sylvain M.

Hors ligne

 

#3 Sat 02 May 2020 14:59

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [PostGreSQL] [PSQL] Format date (TimeStamps) dans un import via COPY

Bonjour,

Avec un trigger sur la table, qui convertit le text en timestamp avec la formule.

Nicolas

Hors ligne

 

#4 Sat 02 May 2020 15:54

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: [PostGreSQL] [PSQL] Format date (TimeStamps) dans un import via COPY

Bonjour Nicolas, et merci de te pencher sur mon cas.

Finalement, je me suis rendu compte que les données sources n'étaient pas homogènes au niveau du formatage de la date.
Elles sont issues de l'excellent programme ExifTool, que je recommande à tous les géomaticiens photographes.

J'ai ouvert un sujet sur le Forum ExifTool, et j'ai donc trouvé un moyen d'avoir des données plus homogènes.
Sauf qu'il reste encore des données très étrangement formatées, et ce n'est pas lié à ExifTool, mais aux logiciels / appareils photos qui ne respectent pas les standards EXIF).

Je me permets de poster ici mon fil de traitement, au cas où vous verriez des optimisations :

Code:

DROP TABLE IF EXISTS photos.dbphotos;
CREATE TABLE photos.dbphotos (Directory text, filename text, DateTimeOriginal text, model text, GPSLatitude numeric, GPSLongitude numeric);
COPY photos.dbphotos FROM 'M:\Photos\dbphotos.txt' NULL '-' ENCODING 'UTF-8';
ALTER TABLE photos.dbphotos ADD COLUMN geom geometry(Point,4326);
UPDATE photos.dbphotos SET geom = CASE WHEN gpslatitude IS NULL THEN ST_SetSRID(ST_MakePoint(0, 0), 4326) ELSE ST_SetSRID(ST_MakePoint(gpslongitude, gpslatitude), 4326) END;
CREATE INDEX dbphotos_geom_gist ON photos.dbphotos USING GIST (geom);
ALTER TABLE photos.dbphotos ADD COLUMN datetime timestamp;
UPDATE photos.dbphotos SET datetime = COALESCE(to_timestamp(CASE WHEN datetimeoriginal IN ('    :  :     :  :', '', '0000:00:00 00:00:00') THEN '1900:01:01 00:00' ELSE datetimeoriginal END,'YYYY:MM:DD HH24:MI'),to_timestamp('1900:01:01 00:00','YYYY:MM:DD HH24:MI'));

Finalement, je garde le champ d'origine au format texte (que je pourrai supprimer, mais qui me permet de voir comment est stockée l'info dans les EXIF), mais j'ajoute un champ de type timestamp.

Je vais ouvrir un autre fil de discussion, car tout cela serait optimisable si on pouvait récupérer toutes les données potentielles des métadonnées de photos directement dans une base de données (là, j'ai limité à quelques champs et une table "à plat")

Dernière modification par Sylvain M. (Sat 02 May 2020 15:54)


Sylvain M.

Hors ligne

 

Pied de page des forums

Powered by FluxBB