#1 Fri 24 September 2021 10:51
[FME] Transformation d'un xls "Unpivot" avec FME
Bonjour à tous,
Le titre n'est pas forcément explicite mais il me semble que l'idée que je souhaite faire est un "unpivot" de mon tableau, j'espère ne pas me tromper sur le sens de cette notion !
J’ai un tableau xls formaté comme suit en entrée (comptages routiers pour un point donné tous les 1/4 d’heure, sur 7 jours avec les 1/4 heures en lignes et les jours en colonne) :
Heure|date1|date2|date3|…
00:15|v1|v2|v3|…
00:30|v4|v5|v6|…
...
Je souhaite obtenir un tableau de ce type :
Date/Heure Valeur
date1 00:15 v1
date1 00:30 v4
date2 00:15 v2
date2 00:30 v5
date3 00:15 v3
date3 00:30 v6
Et ainsi de suite … en commençant à chercher sur le forum, j'ai bien trouvé ce fil de discussion très intéressant : https://georezo.net/forum/viewtopic.php?id=60366 et j'arrive bien à obtenir le résultat suivant :
_attr_name | _attr_value
heure | 00:15
date1 | v1
date2 | v2
date3 | v3
heure | 00:30
date1 | v4
date2 | v5
date3 | v6
mais je bute sur la combinaison de deux attributs (heure et date) pour obtenir le résultat attendu. L'idée étant de venir créer un nouveau fichier csv.
Merci à tous pour nos prochains échanges !
Hors ligne
#2 Sat 25 September 2021 19:39
- SRapenne
- Participant occasionnel
- Date d'inscription: 2 Feb 2020
- Messages: 28
Re: [FME] Transformation d'un xls "Unpivot" avec FME
Bonjour,
Je n'ai pas de reponse concrète à t'apporter, mais je fais un usage très régulier de ce genre de pivot et je n'ai rien trouvé de concluant en FME pur et comme je maitrise plutôt bien R, qui lui sait faire ça sans problème, je passe systematiquement par un Rcaller ce qui oblige à installer R. Si tu connais et utilise dèjà R, je pourrais te fournir du code pour faire çà.
Serge
Dernière modification par SRapenne (Sat 25 September 2021 19:39)
Hors ligne
#3 Sun 26 September 2021 11:05
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 426
Re: [FME] Transformation d'un xls "Unpivot" avec FME
Bonjour,
Je suppose que les champs date1, date2, date3 ne sont pas connus en avance ?
Par exemple tu as un fichier comme suis avec les 7 derniers jours :
Code:
Heure|18/09/2021|19/09/2021|20/24/09/2021|21/09/2021|22/09/2021|23/09/2021|24/09/2021 00:15|v1|v2|v3|… 00:30|v4|v5|v6|…
C'est bien ça ?
Si c'est le cas en effet pas évident dans FME car les noms des champs seront pris dans le schema du fichier d'entrée.
Et donc à part passer par un pythoncaller ou un rcaller comme proposé par Serge, je ne vois pas trop.
Mais il y a peut-être d'autres solutions.
Si tu connais d'avance les noms des champs, tu peux utiliser un inlinequerier par exemple et via du SQL faire une union de chaque colonne :
Code:
select "date1" as date, heure, date1 as valeur from input union all select "date2" as date, heure, date2 as valeur from input union all select "date3" as date, heure, date3 as valeur from input union all select "date4" as date, heure, date4 as valeur from input union all select "date5" as date, heure, date5 as valeur from input union all select "date6" as date, heure, date6 as valeur from input union all select "date7" as date, heure, date7 as valeur from input
Hors ligne
#4 Sun 26 September 2021 12:24
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 426
Re: [FME] Transformation d'un xls "Unpivot" avec FME
Finalement, en creusant un peu j'ai une solution via le paramètre "Scan schema in dynamic workflow" dans les paramètres avancés du reader Excel.
Ça permet de récupérer les colonnes dans les entités même quand leur nom change. Elles ne sont pas exposées mais on les récupère dans le AttributeExploder.
Donc ensuite dans le AttributeExploder il faut bien cocher "Keep attributes" comme ça on conserve l'attribut Heure. Et on peut nommer Attribute Name Label "Date" et Attribute Value Label "Valeur".
Puis on garde seulement les entités avec Date correspondant à l'expression rationnelle (8 chiffres à la suite AAAAMMJJ)
Code:
^\d{8}$
A adapter selon le nom de la colonne dans le fichier Excel. Si au format JJ/MM/AAAA l'expression sera
Code:
^\d{2}\/\d{2}\/\d{4}$
Puis un AttributeKeeper pour conserver seulement Date, Heure et Valeur et un Sorter pour trier si besoin.
Ci-joint un workspace sous FME 2021.
Hors ligne