Skip to content

Enrichir ses tableurs Excel ou LibreOffice Calc grâce à des API (4/4) : résultats multiples

28/07/2016

Dernier billet de cette petite série (cf. les billets 1 : présentation, 2 : SPARQL, et 3 : espaces de noms). L’essentiel est dans le premier billet. Les autres ne seront utiles que lorsque vous serez confrontés aux problèmes que chacun d’entre eux évoque.

Donc, celui-ci : quand une requête (sur une API ou un SPARQL Endpoint, peu importe) renvoie plusieurs résultats. J’ai pris l’exemple d’un ISBN qui renvoie plusieurs PPN ou ARK, mais voici un autre besoin : pour un PPN donné, je veux récupérer les indexations sujet.

Je repars sur l’hypothèse d’un tableau à 6 colonnes : ISBN, Titre, Auteur, Editeur, Date, PPN (trouvé grâce à l’ISBN).

billet 4 - tableau init

Exemple : récupération de l’indexation sujet et problème

Les notices RDF sont accessibles via une URL du type http://www.sudoc.fr/009294937.rdf. Dans le RDF, on a 2 types de sujets :

  • les balises <dc:subject> qui contiennent les libellés des mots-clés
  • les balises <dcterms:subject> qui contiennent les URI de ces mots-clés dans IdRef
    (notez au passage que l’ordre d’affichage est indifférent puisque c’est un graphe : la notion d’ordre n’est pas pertinente)
    billet 4 - exemple de subject

Dans mon fichier, le PPN est en colonne F. Et comme je travaille sous Calc je vais devoir supprimer l’espace de nom dc: avant de pouvoir récupérer l’indexation (oui, parce que là, c’est le libellé qui m’intéresse et pas l’URI, c’est comme ça). En G2, je vais donc écrire :

=FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject")

Je déploie la formule sur l’ensemble des lignes du tableau (double-clic gauche sur l’angle inférieur droit de ma cellule G2) et j’obtiens ceci :

billet 4 - résultats sujets

Et je constate rapidement que seule la première occurrence du subject a été récupérée. Comment récupérer les autres ?

Réponse

Ce n’est pas possible. Aucune option d’Excel ou Calc ne permet de récupérer l’ensemble des occurrences d’un XPath (à la différence d’OpenRefine, par exemple, qui récupère une liste quand on utilise la fonction ParseHtml, équivalent de FILTREXML + SERVICEWEB).

Proposition

La manière dont j’essaie de résoudre ce problème, est d’ajouter une colonne pour compter le nombre d’occurrences. Donc en colonne G, je remplace la formule indiquée ci-dessus par :

=FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"count(//subject)")

Ce qui me donne :
billet 4 - décompte des sujets

Si dans ma démarche je souhaite récupérer l’ensemble des valeurs, je suis alors contraint de retenir le nombre maximal d’occurrence constaté (ici : 12) , et de prendre les 12 colonnes suivantes pour y affecter à chaque fois une occurrence de //subject, en fonction de sa position. Donc dans les cellules H2 à S2, je pourrais écrire :

  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[1]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[2]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[3]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[4]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[5]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[6]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[7]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[8]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[9]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[10]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[11]")
  • =FILTREXML(SUBSTITUE(SERVICEWEB("http://www.sudoc.fr/"&F2&".rdf");"dc:";"");"//subject[12]")

En fait c’est une très mauvaise idée : ça veut dire que je vais ouvrir 12 fois la même notice (très peu performant).

Il vaut donc mieux rapatrier une seule fois le contenu du fichier XML et le stocker dans une cellule, et appeler le contenu (avec FILTREXML()) depuis les cellule d’à côté

Et je me retrouve avec plein de #VALEUR très laids. Pour les supprimer : je sélectionne l’ensemble des colonnes, que je copie, puis je fais un collage spécial > texte pour que les formules soient écrasées par les valeurs récupérées. Enfin, j’effectue un chercher-remplacer : chercher « #VALEUR ! », remplacer par «  »

Et enfin :

billet 4 - indexation sujet

Notez au passage la colonne I, intitulée « Notice RDF », dans laquelle vont chercher les colonnes J à U.

C’est le dernier billet de la série, et le dernier billet de l’été : j’entre en hibernation pour quelques semaines.

Bonnes vacances à ceux qui n’en sont pas encore revenus !

2 commentaires
  1. 25/08/2016 15:52

    Merci pour cette série, je n’utilise pas Excel pour ce genre de choses mais ça ouvre des perspectives et c’est là tout l’intérêt de ce genre de série.
    Une remarque sur la dernière étape de copier/coller pour s’affranchir des messages d’erreurs, il existe des fonctions pour traiter ces messages d’erreur, je n’ai pas de tableur sous la main pour confirmer mais quelque chose comme SIERREUR ou son équivalent sous LO pour préfixer ta formule devrait permettre de s’affranchir de cette étape de collage spécial.

Trackbacks

  1. Enrichir ses tableurs Excel ou LibreOffice Calc...

Les commentaires sont fermés.

%d blogueurs aiment cette page :