PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 07/10/2011 14:56:47

damalaan
Membre

transformer un tableau en champs

Bonjour

Suite à un import de fichier txt, j'ai un champ qui ressemble à ça :

1,"1","1","44.13 °C",65280," Etuve1"
2,"1","1","1.83 °C",65280," chambre froide"
3,"1","1","22.70 °C",65280,"  Etuve2"
4,"1","1","103.01 °C",65280," Etuve 30"

je voudrais trouver une fonction du type string_to_array, mais je ne sais pas comment récupérer ensuite les éléments du tableau dans des champs

je voudrais donc un résultat du genre :
id - champ1 - champ2 - temp - etat - libelle
1 - 1 - 1 - 44.13 - actif - Etuve1
2 - 1 - 1 - 1.83 - actif - chambre froide
etc

merci d'avance

Hors ligne

#2 07/10/2011 15:04:36

rjuju
Administrateur

Re : transformer un tableau en champs

Il est possible d'utiliser un delimiteur lors de l'importation d'un fichier (COPY nom_table FROM fichier.txt WITH DELIMITER ',') et ainsi avoir un champ pour chaque élément.

Cependant il vous faudra modifier le champ température soit lors de la génération du fichier texte, soit après l'importation pour enlever le "°C".

Hors ligne

#3 07/10/2011 15:14:04

damalaan
Membre

Re : transformer un tableau en champs

je ne peux pas utiliser COPY car mon fichier contient 2 lignes différentes dans leur format au début :

#2011-10-04#
#1899-12-30 16:50:49#
1,"1","1","44.13 °C",65280," Etuve1"
2,"1","1","1.83 °C",65280," chambre froide"
3,"1","1","22.70 °C",65280,"  Etuve2"
4,"1","1","103.01 °C",65280," Etuve 30"

donc j'importe déjà le fichier en entier, puis je supprime les 2 premières lignes avec un delete

comme mes lignes d'origine n'ont pas la même structure, cela me renvoie une erreur
ERREUR:  données manquantes pour la colonne « champ1 »
CONTEXT:  COPY testimport, ligne 1 : « #2011-10-04# »

Hors ligne

#4 07/10/2011 15:28:33

rjuju
Administrateur

Re : transformer un tableau en champs

Vous pouvez utiliser une syntaxe du genre :
SELECT res[1],res[2] ....
FROM (
  SELECT cast( '{' || champ || '}' as varchar[]) as res) FROM importation
) sql

et ainsi avoir vos données accessibles séparément.

Hors ligne

#5 07/10/2011 15:35:27

damalaan
Membre

Re : transformer un tableau en champs

ouh là je ne comprends pas tout!!

Hors ligne

#6 07/10/2011 15:50:18

flo
Membre

Re : transformer un tableau en champs

À quoi correspondent les 2 premières lignes? Est-ce que ce sont des informations que vous souhaitez conserver dans votre base, ou non? (il semblerait que non, vu que vous supprimer les premières lignes?)
Si non, il serait certainement plus simple de supprimer ces lignes du fichier avant import? Et ensuite on peut l'importer avec COPY directement.
Si oui, alors pourriez-vous expliquer ce que vous souhaitez en sortie? (structure de la ou des tables à la fin du traitement).

Hors ligne

#7 07/10/2011 15:52:51

damalaan
Membre

Re : transformer un tableau en champs

je n'ai que faire effectivement des 2 premières lignes, c'est sur que si elles n'y étaient pas, y'a longtemps que j'aurais avancé!!

je suis en train de chercher comment on manipule les fichiers en powershell pour les supprimer mais sans succès!!

Dernière modification par damalaan (07/10/2011 15:53:12)

Hors ligne

#8 07/10/2011 16:14:18

rjuju
Administrateur

Re : transformer un tableau en champs

Est-ce un traitement unique ou un import régulier ?
Quelle est la taille du fichier ?
D'où provient le fichier et pouvez-vous changer sa génération ?
Quelle est la structure exacte de la table résultant de l'importation ?

Dernière modification par rjuju (07/10/2011 16:15:06)

Hors ligne

#9 07/10/2011 16:23:39

damalaan
Membre

Re : transformer un tableau en champs

Est-ce un traitement unique ou un import régulier ? ==> import régulier plusieurs fois par jour
Quelle est la taille du fichier ? ==> 6Ko
D'où provient le fichier et pouvez-vous changer sa génération ? ==>générer par une centrale de température donc impossible d'en modifier le format
Quelle est la structure exacte de la table résultant de l'importation ?==>avec un ligne comme ça  : 4,"1","1","103.01 °C",65280," Etuve 30" ; la récupération du 4 et de la température me suffit

Hors ligne

#10 07/10/2011 16:30:47

rjuju
Administrateur

Re : transformer un tableau en champs

Vous pouvez utiliser l'étape intermédiaire en powershell suivante

Get-Content .\fichier.txt | select-string . | where { $_.linenumber -gt 2 } > final.txt

et ensuite importer le final.txt en utilisant un délimiteur ','

Dernière modification par rjuju (07/10/2011 16:38:56)

Hors ligne

#11 07/10/2011 16:42:05

damalaan
Membre

Re : transformer un tableau en champs

wah cool powershell!!
je n'ai pas la chance de le connaitre !!
auriez-vous un p'tit site et/ou tuto à me conseiller pour m’initier à ce langage?

je pense que je vais pouvoir me débrouiller maintenant!

merci

Hors ligne

#12 07/10/2011 16:45:16

rjuju
Administrateur

Re : transformer un tableau en champs

Désolé, c'était la première (et j'espère dernière fois) que j'utilisais powershell, et je ne connais vraiment pas du tout ce langage.

Après quelques recherches, je suis tombé sur cet article :
http://powershell-scripting.com/index.p … 89&catid=5 et j'ai un peu adapté.
La syntaxe reste lourde et peu documentée je trouve, mais quand on n'a pas le choix ... smile

Hors ligne

#13 11/10/2011 13:13:57

damalaan
Membre

Re : transformer un tableau en champs

je suis heurté à un autre problème : l'encodage du fichier
quand powershell le mouline l'encodage devient UTF-16LE
voici ma fonction d'importation

CREATE OR REPLACE FUNCTION import()
  RETURNS void AS
$BODY$

set client_encoding to 'LATIN1';
delete from tbl_import_imp;
copy tbl_import_imp from 'C:/temp/final.txt';

$BODY$
  LANGUAGE sql VOLATILE
  COST 100;
ALTER FUNCTION import() OWNER TO postgres;

quand j'appelle la fonction, voici l'erreur retournée :
ERREUR:  séquence d'octets invalide pour l'encodage « LATIN1 » : 0x00

La base est en UTF8

Hors ligne

#14 11/10/2011 13:38:46

rjuju
Administrateur

Re : transformer un tableau en champs

J'avoue que je ne m'y connais vraiment pas en encodage.
A tout hasard, faire un set client_encoding to 'UTF-16LE' au lieu de 'LATIN1' en début de procédure stockée ne pourrait pas résoudre le problème ?

Hors ligne

#15 11/10/2011 13:46:40

damalaan
Membre

Re : transformer un tableau en champs

bon j'ai "épuré" le fichier en powershell!!

Get-Content .\Echange.txt | where { $_ -notmatch "#" } > final.txt
Get-Content .\final.txt | foreach { $_ -replace "°C","" } > final2.txt
Get-Content .\final2.txt | foreach { $_ -replace " ","" } > final3.txt
$a=Get-Content .\final3.txt | foreach { $_ -replace "`"","" } 
out-file -filepath C:\temp\final4.txt -inputobject $a -encoding UTF8

et ça fonctionne!

merci
à plus pour le prochain problème!!

Hors ligne

Pied de page des forums