Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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".
Julien.
https://rjuju.github.io/
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.
Julien.
https://rjuju.github.io/
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)
Julien.
https://rjuju.github.io/
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)
Julien.
https://rjuju.github.io/
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 ...
Julien.
https://rjuju.github.io/
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 ?
Julien.
https://rjuju.github.io/
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
Pages : 1