Introduction
La plupart des données de R&D proviennent de bases de données, de fichiers Excel ou CSV, ou sont saisies directement dans JMP. Mais les données de support sont souvent présentées sous d’autres formats, notamment des fichiers PDF. Pensez par exemple aux tables de référence chimique, aux fiches d’information des fournisseurs ou même aux données historiques des entreprises qui n’existent désormais qu’au format PDF. Ce type d’informations de support peut être très utile pour compléter les données expérimentales et, heureusement, JMP dispose d’un assistant d’importation PDF qui permet d’importer ce type de données. Étant donné que ces tables n’ont pas été formatées pour des logiciels statistiques comme JMP, l’importation de données à partir de fichiers PDF génère souvent des tables de données désordonnées qui nécessitent parfois des étapes de nettoyage supplémentaires.
Dans mon passé de R&D, j'avais connaissance de l'assistant d'importation PDF dans JMP et je l'utilisais parfois. Il m'est également arrivé de trouver des données PDF pour enrichir mon projet de recherche, mais je ne savais pas comment nettoyer le tableau après avoir importé les données dans JMP. Dans ces cas-là, j'ai dû abandonner le projet et renoncer aux informations supplémentaires, ce qui était très frustrant.
Quelques années plus tard, je pense avoir désormais les outils nécessaires pour gérer n'importe quel fichier PDF, quelle que soit la complexité des données après l'importation. Comme pour de nombreux problèmes de données désordonnées, les formules de colonnes sont la solution idéale pour nettoyer les données PDF importées. Cela est particulièrement vrai lors de l'enregistrement des étapes dans Workflow Builder ou lorsque la capture du script est souhaitée pour automatiser le processus.
Qui devrait lire ce blog ?
Continuez à lire si vous :
- Vous souhaitez en savoir plus sur les bases de l'assistant d'importation PDF
- Vous êtes bloqué avec le nettoyage des données après l'importation de données PDF
- Vous souhaitez en savoir plus sur l'utilisation des colonnes d'indicateurs et des indices de colonnes pour nettoyer les données
- Vous souhaitez apprendre à effectuer en boucle les étapes de nettoyage DPF sur plusieurs pages
Notez que vous n’êtes pas obligé de tout lire, vous pouvez passer directement à la section qui vous intéresse ci-dessous.
Aperçu
Je reviens à deux concepts lorsque je nettoie des données importées à partir de fichiers PDF, que j'utilise soit seuls, soit en combinaison. Ce sont :
- Colonnes d'indicateurs : création d'un indicateur binaire pour identifier les lignes qui répondent à un certain critère. Il peut s'agir de « manquant » ou « non manquant », « zéro » ou « non nul », etc. Les colonnes d'indicateurs peuvent également être utilisées conjointement avec la sélection de lignes en fonction d'une condition.
- Indices de ligne : comparez une cellule à la suivante (ou à la précédente) et utilisez-la pour générer une colonne de marquage ou pour concaténer des valeurs de cellule à partir de cellules séquentielles. Utilisez Row(), Row() +1, Row()-1 comme indice de colonne (utilisé entre crochets d'indice « [ ] »).
J’ai également un certain nombre de formules utiles que j’utilise souvent.
Formules utiles :
- Manquant()
- Contient()
- Si ()
- Longueur()
- Concaténer (« || »)
Dans cet article de blog, j'examinerai les types de problèmes suivants généralement associés à l'importation de données PDF :
Pour chaque sujet, vous trouverez à la fois une courte discussion ainsi qu'une vidéo.
Avant d’examiner ces problèmes et la façon de les résoudre, n’oubliez pas que dans JMP, il existe presque toujours plusieurs façons d’obtenir le même résultat final. Cependant, je choisirai des solutions enregistrées dans Workflow Builder pour rendre les étapes de nettoyage répétables avec un workflow. En règle générale, cela signifie que j’utiliserai des colonnes de formules au lieu de l’option de clic droit « plus rapide » (si disponible) ou que j’utiliserai une option complémentaire. La configuration des étapes de nettoyage de manière à ce que chaque étape soit enregistrée me permet d’utiliser le workflow sur d’autres tables de données qui nécessitent exactement les mêmes étapes de nettoyage. Par exemple, consultez l’exemple final d’un tableau PDF qui s’étend sur 13 pages. Lors de l’importation de ce PDF dans JMP, 13 tables sont créées. Comme vous pouvez le voir dans la dernière vidéo, j’ai enregistré les étapes de nettoyage pour la première table avec des colonnes de formules, puis j’ai bouclé les étapes de nettoyage dans JMP pour les appliquer aux 13 tables (effectué avec la fonction Group with For Each dans Workflow Builder dans JMP 18), ce qui facilite le nettoyage des 13 tables ! Accédez aux vidéos avec les exemples de boucle Workflow Builder ici .
Commençons par un exemple simple. Si vous n'êtes pas familier avec l'assistant d'importation PDF dans JMP, regardez d'abord cette vidéo pour voir comment j'utilise l'assistant d'importation pour importer des données dans JMP sous forme de PDF.
Problème 1 : valeurs de cellule manquantes en raison d'un en-tête de ligne fusionné dans un PDF.
Les tableaux des fichiers PDF sont souvent formatés comme si plusieurs lignes étaient fusionnées et contenaient une seule valeur, comme un sous-en-tête. Lors de l'importation dans JMP, le tableau comporte des lignes vides au lieu de répéter la valeur pour chaque ligne contenant des données (Figure 1).
Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1 : Valeurs de cellules manquantes dans JMP (côté droit de l'image) en raison de sous-en-têtes de ligne fusionnés (côté gauche de l'image).
Une solution rapide possible pour le nettoyage consiste à sélectionner la colonne contenant les valeurs manquantes (par exemple, la colonne 3 dans la figure 1), puis à cliquer avec le bouton droit sur une cellule et à sélectionner Remplir , puis à Remplacer les valeurs manquantes par la valeur précédente . Dans toutes les versions de JMP jusqu'à JMP 18, cette action de clic droit n'est pas encore enregistrée dans Workflow Builder ou dans le journal avancé. Elle sera ajoutée dans JMP 19, mais pour les versions antérieures, une option plus robuste pour remplacer les valeurs de cellule manquantes par la valeur précédente enregistrée dans Workflow Builder ou dans le journal avancé consiste à utiliser une formule de colonne. J'ai utilisé une formule de colonne qui, dans la formule elle-même, attribue une variable appelée « var » si la colonne 3 n'est pas manquante, puis utilise cette valeur pour la valeur manquante suivante (figure 2). Cette méthode fonctionne bien pour remplacer les valeurs précédentes, car la formule de colonne est exécutée de haut en bas. En d’autres termes, chaque fois qu’il y a une valeur dans la colonne 3, la variable « var » est mise à jour et la valeur mise à jour est utilisée pour les lignes suivantes jusqu’à ce qu’une nouvelle mise à jour se produise pour une ligne non manquante.
Figure 2: Replacing missing with previous value column formula.Figure 2: Replacing missing with previous value column formula.Figure 2: Replacing missing with previous value column formula.Figure 2: Replacing missing with previous value column formula. Figure 2 : Formule de remplacement de la colonne manquante par la valeur précédente.
Regardez-moi démontrer cette étape dans la vidéo suivante :
Problème 2a : la valeur de la cellule est répartie sur plusieurs lignes
Un autre exemple de lignes fusionnées dans un tableau PDF qui nécessitent un nettoyage dans JMP est lorsqu'une valeur, telle qu'un sous-en-tête, est divisée sur plusieurs lignes dans une colonne (Figure 3).
Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3 : Une valeur de cellule, dans ce cas un sous-en-tête de catégorie (à gauche), est divisée sur plusieurs lignes lors de l'importation dans JMP (à droite).
Pour résoudre ce problème, les parties des chaînes doivent être identifiées puis reliées entre elles. La chaîne entière doit être répétée pour les lignes appropriées, puis les chaînes partielles restantes doivent être supprimées. Une façon de résoudre ce problème est de créer une colonne d'indicateurs qui identifie les éléments manquants par rapport aux éléments non manquants, ou qui identifie la « ligne suivante manquante » par rapport à la « ligne suivante non manquante ». Pour l'exemple de la figure 3, voici une séquence d'étapes possible (toutes présentées dans la figure 4) :
- Identifiez les lignes contenant du texte et les lignes sans texte avec une colonne Indicateur (étape 1).
- Utilisez la colonne Drapeau et une formule avec des indices de ligne pour identifier les lignes contenant du texte et concaténer avec le texte de la ligne suivante (étape 2).
- Une fois qu'il y a des cellules avec la chaîne entière, créez une colonne d'indicateurs pour identifier les lignes avec des chaînes de texte partielles et supprimez ces chaînes partielles (étapes 3 et 4).
Remplacez les valeurs manquantes des cellules vides par la chaîne entière (voir la solution pour le problème 1).
Dans l’exemple de la figure 3, j’ai utilisé les formules présentées dans la figure 4.
Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4 : Série de formules de colonnes pour rechercher et corriger un sous-en-tête divisé sur deux lignes.
Vous pouvez me voir démontrer ces étapes ici :
Problème 2b : la valeur de la cellule est répartie sur plusieurs colonnes
Pour l’exemple suivant, j’utilise un fichier PDF différent, que j’ai trouvé ici . Dans ce cas, les valeurs des cellules sont réparties sur deux lignes ET sur deux colonnes. Regardez l’image de gauche de la Figure 5. Dans cet exemple, le nom chimique « Oxy-1,4-phénylènesulfonyl-1,4-phénylèneoxy-1,4-phénelyneisopropylidène-1,4-phénylène » (indiqué par la case bleue) est non seulement divisé sur deux lignes mais aussi sur deux colonnes. Cela s’est produit parce que, plus haut dans le tableau, deux valeurs pour la transition vitreuse Tg sont répertoriées au lieu d’une, ce qui rend impossible pour un séparateur de colonnes d’éviter de couper soit le nom chimique, soit les valeurs Tg (voir le séparateur de colonnes vertical rouge).
Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5 : Tableau des transitions thermiques illustrant une valeur de cellule divisée en plusieurs colonnes et lignes.
(Source : https://www3.nd.edu/~hgao/thermal_transitions_of_homopolymers.pdf)
Lorsque le séparateur de colonnes est placé, comme indiqué dans l'image de gauche de la Figure 5, il y a deux cellules dans la colonne Tg qui ont un texte de coupure qui appartient à la colonne Unité répétitive. Dans ce cas, nous pouvons utiliser le fait que le texte de coupure est constitué de lettres, au lieu des chiffres qui se trouvent dans les autres cellules. Par conséquent, une façon de corriger ce problème est de suivre ces étapes, comme indiqué dans la Figure 6 :
- Créez une colonne avec le premier caractère (étape 1).
- Utilisez l'option Remplacer la chaîne de la plateforme Recode pour remplacer tout ce qui est un nombre par rien. Pour cela, j'ai utilisé l'expression régulière [0-9-] pour trouver tous les nombres, y compris le « - ». (Étape 2).
- Utilisez la formule « Ismissing » pour localiser la chaîne de texte et la concaténer avec la chaîne d’origine (coupée) (étape 3).
- Nettoyez la colonne Tg à l'aide d'instructions conditionnelles et de la colonne Text Flag. Bien que cette méthode soit un peu maladroite, elle fait l'affaire. Si vous connaissez une expression régulière, vous pouvez également l'utiliser ici sous l'option de colonne Recode. J'ai utilisé les instructions conditionnelles présentées dans la figure 7.
Après tout ce nettoyage, j'ai identifié où le contenu des cellules est divisé verticalement sur deux lignes : les lignes 39/40, 41/42 et 43/44. Les cellules qui sont divisées ont la première partie de la chaîne se terminant par un « - », ce qui pourrait être utilisé comme indicateur. Ensuite, une construction de formule comme celle illustrée dans la figure 4 peut être utilisée pour additionner les chaînes de texte. Finalement, les cellules de données vides peuvent être supprimées pour éviter les lignes en double.
Figure 6: Finding and concatenating split text strings.Figure 6: Finding and concatenating split text strings.Figure 6: Finding and concatenating split text strings.Figure 6: Finding and concatenating split text strings.Figure 6 : Recherche et concaténation de chaînes de texte divisées.
Figure 7: Removing text string from numbers column.Figure 7: Removing text string from numbers column.Figure 7: Removing text string from numbers column.Figure 7: Removing text string from numbers column.Figure 7 : Suppression de la chaîne de texte de la colonne de nombres.
La vidéo suivante montre comment j'ai utilisé ces étapes afin que vous puissiez voir une solution possible à ce problème.
Problème 3 : les lignes avec des en-têtes ou des sous-en-têtes sont mélangées aux données
Pour le dernier exemple, je reviens au PDF qui répertorie les compositions en acides gras des graisses. Dans ce cas, vous pouvez voir que le tableau de données contient des lignes avec des en-têtes, des unités ou des sous-en-têtes qui, lors de l'importation dans JMP, sont désormais mélangés aux données (Figure 8).
Une façon d'identifier ces lignes consiste à utiliser la formule « Contient » pour identifier un symbole ou une chaîne de texte dans la ligne d'en-tête/unité qui ne se trouve pas dans les données réelles. Dans la figure 8, par exemple, nous utilisons la formule « Contient(« % ») ». Cette formule produira soit un « 0 » si ce symbole n'apparaît pas dans la cellule, soit à l'emplacement réel du caractère dans la chaîne (donnant un entier > 0). Avec une simple instruction conditionnelle, une colonne d'indicateurs peut être générée.
Pour cet exemple, une formule possible est illustrée dans la Figure 9. Pour supprimer les lignes comportant un « 1 » (indiquant la présence du « % »), sélectionnez les lignes qui répondent à ce critère en utilisant l’option « sélectionner où » dans le menu Ligne/Sélection de ligne (Figure 10). Ensuite, supprimez les lignes sélectionnées. Le journal avancé et le générateur de flux de travail capturent cette séquence d’étapes et peuvent l’automatiser pour une utilisation répétée. Notez qu’il existe un nombre limité de critères de sélection de déclenchement directement disponibles sous le menu « sélectionner où », notamment « Contient », vous pouvez donc le configurer directement et renoncer à la colonne Indicateur.
Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table.Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table.Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table.Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table. Figure 8 : Les lignes avec des en-têtes ou des sous-en-têtes sont mélangées aux données et apparaissent sous forme de lignes dans la table JMP.
Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9 : Instruction conditionnelle avec la formule « Contient » pour créer une colonne Indicateur qui identifie si le caractère « % » est présent.
Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10 : Ajout de critères de sélection de ligne conditionnels à l’aide d’une colonne Indicateur.
Dans cette vidéo, vous pouvez voir les étapes de nettoyage utilisées pour identifier et supprimer les lignes indésirables dans la table de données (dans ce cas, les lignes de sous-en-tête).
Vidéos bonus : Exemples d'importation avec la boucle WorkflowBuilder
Dans cette vidéo, regardez comment toutes les étapes de nettoyage effectuées pour la première page peuvent être appliquées à une deuxième page en quelques clics. J'utilise la boucle « Grouper avec pour chaque » dans Workflow Builder pour l'exemple fat.pdf montré dans la discussion ci-dessus. Ensuite, je montre un cas plus extrême où j'ai 13 pages dans un format de tableau large. Chaque page doit être importée séparément et doit être nettoyée. Cependant, une fois que j'ai utilisé l'assistant d'importation PDF pour importer le tableau de chaque page, je peux simplement enregistrer les étapes de nettoyage pour un tableau. Je peux ensuite utiliser l'option « Grouper avec pour chaque » dans Workflow Builder pour exécuter automatiquement les étapes de nettoyage sur les 12 autres ! Comment est-ce efficace ?!
Enfin, je suis sûr à 100 % qu'il existe des moyens plus courts ou plus efficaces de résoudre certains de ces problèmes que je ne connais pas encore. N'hésitez pas à partager d'autres solutions dans les commentaires ci-dessous.