Introduzione
La maggior parte dei nostri dati in R&S proviene da database, file Excel o CSV, oppure viene immessa direttamente in JMP. Tuttavia, i dati di supporto spesso sono disponibili in altri formati, in particolare file PDF. Ad esempio, pensa alle tabelle di riferimento chimiche, alle schede informative dei fornitori o persino ai dati aziendali storici che ora esistono solo in formato PDF. Questo tipo di informazioni di supporto può essere molto utile per integrare i dati sperimentali e, per fortuna, JMP ha una procedura guidata di importazione PDF che consente di importare questo tipo di dati. Poiché queste tabelle non sono state formattate per software statistici come JMP, l'importazione di dati da PDF spesso si traduce in tabelle di dati disordinate che a volte richiedono ulteriori passaggi di pulizia.
Nel mio passato di R&S, ero a conoscenza della procedura guidata di importazione PDF in JMP e l'ho usata a volte. Ci sono stati anche casi in cui ho trovato dati PDF per aumentare il mio progetto di ricerca, ma non sono riuscito a capire come ripulire la tabella dopo aver importato i dati in JMP. In quei casi, ho dovuto abbandonare il progetto e rinunciare alle informazioni aggiuntive, il che è stato molto frustrante.
Facciamo un salto in avanti di qualche anno e ora sento di avere gli strumenti per gestire qualsiasi file PDF, non importa quanto siano disordinati i dati dopo l'importazione. Come molti problemi di dati disordinati, le formule di colonna sono la strada da seguire per ripulire i dati PDF importati. Ciò è particolarmente vero quando si registrano i passaggi in Workflow Builder o quando si desidera catturare lo script per automatizzare il processo.
Chi dovrebbe leggere questo blog?
Continua a leggere se:
- Vuoi saperne di più sulle basi della procedura guidata di importazione PDF
- Rimani bloccato con la pulizia dei dati dopo l'importazione dei dati PDF
- Vuoi saperne di più sull'utilizzo delle colonne flag e degli indici di colonna per ripulire i dati
- Vuoi imparare come eseguire cicli di pulizia DPF su più pagine
Tieni presente che non è necessario leggerlo tutto: puoi passare direttamente alla sezione di tuo interesse qui sotto.
Panoramica
Mi accorgo di tornare a due costrutti quando pulisco i dati importati dai PDF, che uso da soli o in combinazione. Sono:
- Colonne di flag: creazione di un flag binario per identificare le righe che soddisfano un determinato criterio. Può essere "mancante vs non mancante", "zero" vs "non zero" e così via. Le colonne di flag possono anche essere utilizzate insieme alla selezione di righe in base a una condizione.
- Indici di riga: confronta una cella con la successiva (o con la precedente) e usa questo per generare una colonna di flag o per concatenare i valori delle celle da celle sequenziali. Usa Row(), Row() +1, Row()-1 come indice di colonna (usato tra parentesi di indice “[ ]”).
Ho anche una serie di formule utili che uso spesso.
Formule utili:
- Mancante()
- Contiene()
- Se ()
- Lunghezza()
- Concatenare (“||”)
In questo post del blog esaminerò i seguenti tipi di problemi tipicamente associati all'importazione di dati PDF:
Per ogni argomento troverete sia una breve discussione che un video.
Prima di esaminare questi problemi e come risolverli, ricorda che in JMP ci sono quasi sempre più modi per arrivare allo stesso risultato finale. Tuttavia, sceglierò soluzioni registrate in Workflow Builder per rendere i passaggi di pulizia ripetibili con un flusso di lavoro. In genere, ciò significa che utilizzerò colonne formula anziché l'opzione "più rapida" del clic destro (se disponibile) o utilizzando un'opzione aggiuntiva. Impostare i passaggi di pulizia in modo che ogni passaggio venga registrato mi consente di utilizzare il flusso di lavoro su altre tabelle di dati che necessitano esattamente degli stessi passaggi di pulizia. Ad esempio, guarda l'esempio finale di una tabella PDF che si estende su 13 pagine. Quando importi questo PDF in JMP, vengono create 13 tabelle. Come puoi vedere nell'ultimo video, ho registrato i passaggi di pulizia per la prima tabella con colonne formula, quindi ho ripetuto i passaggi di pulizia in JMP per applicarli a tutte le 13 tabelle (fatto con la funzione Group with For Each in Workflow Builder in JMP 18), il che semplifica la pulizia delle 13 tabelle! Vai ai video con gli esempi di Workflow Builder Looping qui .
Cominciamo con un semplice esempio. Se non hai familiarità con la procedura guidata di importazione PDF in JMP, guarda prima questo video per vedere come uso la procedura guidata di importazione per ottenere dati in JMP in questo PDF.
Problema 1: valori delle celle mancanti a causa dell'unione dell'intestazione di riga nel PDF.
Spesso le tabelle nei file PDF sono formattate come se diverse righe fossero unite e contenessero un singolo valore, come un sottotitolo. Dopo l'importazione in JMP, la tabella ha righe vuote invece di ripetere il valore per ogni riga che contiene dati (Figura 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).Figura 1: Valori delle celle mancanti in JMP (lato destro dell'immagine) a causa dell'unione delle sottointestazioni di riga (lato sinistro dell'immagine).
Una possibile soluzione rapida per la pulizia è selezionare la colonna con i valori mancanti (ad esempio, Colonna 3 nella Figura 1), quindi fare clic con il pulsante destro del mouse su una cella e selezionare Riempi , seguito da Sostituisci mancante con valore precedente . In tutte le versioni di JMP fino a JMP 18, questa azione di clic con il pulsante destro del mouse non viene ancora registrata in Workflow Builder o nel registro avanzato. Verrà aggiunta in JMP 19, ma per le versioni precedenti, un'opzione più solida per sostituire i valori di cella mancanti con il valore precedente registrato in Workflow Builder o nel registro avanzato è quella di utilizzare una formula di colonna. Ho utilizzato una formula di colonna che, nella formula stessa, assegna una variabile chiamata "var" se la Colonna 3 non è mancante, quindi utilizza questo valore per il valore mancante successivo (Figura 2). Questo metodo funziona bene per sostituire i valori precedenti, perché la formula di colonna viene eseguita dall'alto verso il basso. In altre parole, ogni volta che c'è un valore nella Colonna 3, la variabile "var" viene aggiornata e il valore aggiornato viene utilizzato per le righe successive fino a quando non si verifica un nuovo aggiornamento per una riga non mancante.
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. Figura 2: Sostituzione della formula della colonna con il valore mancante con quello precedente.
Guarda come mostro questo passaggio nel prossimo video:
Problema 2a: il valore della cella è suddiviso su più righe
Un altro esempio di righe unite in una tabella PDF che richiedono la pulizia in JMP è quando un valore, come un sottotitolo, è suddiviso su più righe in una colonna (Figura 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).Figura 3: Un valore di cella, in questo caso un sottotitolo di categoria (sinistra), viene suddiviso su più righe durante l'importazione in JMP (destra).
Per ripulire questo, le parti delle stringhe devono essere identificate e poi unite insieme. L'intera stringa deve essere ripetuta per le righe appropriate e poi le stringhe parziali rimanenti devono essere eliminate. Un modo per risolvere questo problema è creare una colonna Flag che identifichi mancante rispetto a non mancante, o che identifichi "riga successiva mancante" rispetto a "riga successiva non mancante". Per l'esempio nella Figura 3, la seguente è una possibile sequenza di passaggi (tutti mostrati nella Figura 4):
- Identificare le righe contenenti testo e le righe senza testo mediante una colonna Flag (Passaggio 1).
- Utilizzare la colonna Flag e una formula con indici di riga per identificare le righe con testo e concatenarle con il testo nella riga successiva (Passaggio 2).
- Una volta che ci sono celle con la stringa completa, crea una colonna flag per identificare le righe con stringhe di testo parziali ed elimina queste stringhe parziali (passaggi 3 e 4).
Sostituisci i valori mancanti delle celle vuote con l'intera stringa (vedi soluzione per il problema 1).
Nell'esempio della Figura 3, ho utilizzato le formule mostrate nella Figura 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.Figura 4: Serie di formule di colonna per trovare e correggere un sottotitolo suddiviso su due righe.
Puoi vedermi dimostrare questi passaggi qui:
Problema 2b: il valore della cella è suddiviso su più colonne
Per il prossimo esempio, utilizzo un file PDF diverso, che ho trovato qui . In questo caso, i valori delle celle sono suddivisi su due righe E su due colonne. Guarda l'immagine a sinistra nella Figura 5. In questo esempio, il nome chimico "Oxy-1,4-phenylenesulfonyl-1,4-phenyleneoxy-1,4-phenelyneisopropylidene-1,4-phenylene" (indicato dal riquadro blu) non è solo suddiviso su due righe, ma anche su due colonne. Ciò è accaduto perché, più in alto nella tabella, sono elencati due valori per la transizione vetrosa Tg anziché uno, rendendo impossibile per un divisore di colonna evitare di tagliare il nome chimico o i valori Tg (vedi il divisore di colonna verticale rosso).
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.Figura 5: Tabella delle transizioni termiche che mostra un valore di cella suddiviso su più colonne e righe.
(Fonte: https://www3.nd.edu/~hgao/thermal_transitions_of_homopolymers.pdf)
Quando il divisore di colonna è posizionato, come mostrato nell'immagine a sinistra della Figura 5, ci sono due celle nella colonna Tg che hanno testo di troncamento che appartiene alla colonna Unità ripetuta. In questo caso, possiamo usare il fatto che il testo di troncamento è lettere, invece dei numeri che sono nelle altre celle. Pertanto, un modo per correggere questo problema è seguire questi passaggi, come mostrato nella Figura 6:
- Creare una colonna con il primo carattere (Passaggio 1).
- Utilizzare l'opzione Replace String della piattaforma Recode per sostituire qualsiasi cosa che sia un numero con niente. Per questo, ho utilizzato l'espressione regolare [0-9-] per trovare tutti i numeri, incluso il "-". (Passaggio 2).
- Utilizzare la formula "Ismissing" per individuare la stringa di testo e concatenarla con la stringa originale (tagliata) (Passaggio 3).
- Pulisci la colonna Tg usando istruzioni condizionali e la colonna Text Flag. Sebbene questo metodo sia un po' macchinoso, fa il suo lavoro. Se conosci un'espressione regolare, puoi usarla anche qui sotto l'opzione di colonna Recode. Ho usato le istruzioni condizionali mostrate nella Figura 7.
Dopo tutta questa pulizia, ho identificato dove il contenuto delle celle è diviso verticalmente su due righe: Righe 39/40, 41/42 e 43/44. Le celle che sono divise hanno la prima parte della stringa che termina con un "-", quindi potrebbe essere usato come indicatore. Quindi, una costruzione di formula come quella mostrata nella Figura 4 può essere usata per sommare le stringhe di testo. Alla fine, le celle di dati vuote possono essere eliminate per evitare righe duplicate.
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.Figura 6: Ricerca e concatenazione di stringhe di testo divise.
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.Figura 7: Rimozione della stringa di testo dalla colonna dei numeri.
Il video seguente mostra come ho utilizzato questi passaggi, così puoi vedere una possibile soluzione a questo problema.
Problema 3: le righe con intestazioni o sottotitoli vengono mescolate ai dati
Per l'ultimo esempio, torno al PDF che elenca le composizioni degli acidi grassi per i grassi. In questo caso, puoi vedere che la tabella dati contiene righe con intestazioni, unità o sottointestazioni che, una volta importate in JMP, sono ora mescolate ai dati (Figura 8).
Un modo per identificare tali righe è usare la formula "Contains" per identificare un simbolo o una stringa di testo nella riga di intestazione/unità che non si trova nei dati effettivi. Nella Figura 8, ad esempio, usiamo la formula "Contains("%"). Questa formula darà come risultato uno "0" se questo simbolo non si verifica nella cella o nella posizione effettiva del carattere nella stringa (che darà come risultato un intero > 0). Con una semplice istruzione condizionale, è possibile generare una colonna Flag.
Per questo esempio, una possibile formula è mostrata nella Figura 9. Per rimuovere le righe con un "1" (che indica che è presente il "%"), seleziona le righe che soddisfano questo criterio utilizzando l'opzione "seleziona dove" dal menu Riga/Selezione riga (Figura 10). Quindi, elimina le righe selezionate. Il registro avanzato e Workflow Builder catturano questa sequenza di passaggi e possono automatizzarla per un uso ripetuto. Nota che c'è un set limitato di criteri di selezione direttamente disponibili nel menu "seleziona dove", incluso "Contiene", quindi potresti impostarlo direttamente e rinunciare alla colonna Flag.
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. Figura 8: Le righe con intestazioni o sottotitoli vengono mescolate ai dati e visualizzate come righe nella tabella 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.Figura 9: Istruzione condizionale con formula "Contiene" per creare una colonna Flag che identifica se è presente il carattere "%".
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.Figura 10: Aggiunta di criteri di selezione delle righe condizionali mediante una colonna Flag.
In questo video puoi vedere i passaggi di pulizia utilizzati per identificare e rimuovere le righe indesiderate nella tabella dati (in questo caso, le righe delle sottointestazioni).
Video bonus: esempi di importazione con il ciclo WorkflowBuilder
In questo video, guarda come tutti i passaggi di pulizia eseguiti per la prima pagina possono essere applicati a una seconda pagina con pochi clic. Utilizzo il ciclo "Group with For Each" in Workflow Builder per l'esempio fat.pdf mostrato nella discussione sopra. Successivamente, mostro un caso più estremo in cui ho 13 pagine in un formato di tabella ampia. Ogni pagina deve essere importata separatamente e deve essere pulita. Tuttavia, una volta utilizzata la procedura guidata di importazione PDF per importare la tabella da ogni pagina, posso semplicemente registrare i passaggi di pulizia per una tabella. Posso quindi utilizzare l'opzione "Group with For Each" in Workflow Builder per eseguire automaticamente i passaggi di pulizia sulle altre 12! Com'è efficiente!?!
Infine, sono sicuro al 100% che ci sono modi più brevi o più ordinati per affrontare alcuni di questi problemi che non conosco...ancora. Sentiti libero di condividere altre soluzioni nei commenti qui sotto.