介紹
我們研發中的大部分資料來自資料庫、Excel 或 CSV 文件,或是直接輸入到 JMP 中。但支援資料通常採用其他格式,尤其是 PDF 檔案。例如,考慮化學參考表、供應商資訊表,甚至現在僅以 PDF 形式存在的歷史公司資料。此類支援資訊對於補充實驗數據非常有幫助,值得慶幸的是,JMP 有一個 PDF 導入嚮導,可以導入此類數據。由於這些表格未針對 JMP 等統計軟體進行格式化,因此從 PDF 匯入資料通常會導致資料表格混亂,有時需要額外的清理步驟。
在我過去的研發過程中,我知道 JMP 中的 PDF 匯入精靈,有時會使用它。在某些情況下,我找到了 PDF 資料來擴充我的研究項目,但我不知道如何在將資料匯入 JMP 後清理表格。在這些情況下,我不得不放棄該項目並放棄額外的信息,這非常令人沮喪。
時間快轉了幾年,現在我覺得我擁有處理任何 PDF 檔案的工具,無論匯入後的資料有多混亂。與許多混亂的資料問題一樣,列公式是清理匯入的 PDF 資料的方法。當在 Workflow Builder 中記錄步驟或需要擷取腳本來自動化流程時尤其如此。
誰應該閱讀此部落格?
如果您符合以下條件,請繼續閱讀:
- 想要了解有關 PDF 導入嚮導的基礎知識的更多信息
- 匯入 PDF 資料後遇到資料清理問題
- 想要了解有關使用標誌列和列下標清理資料的更多信息
- 想要了解如何在多個頁面上循環 DPF 清理步驟
請注意,您不必閱讀所有內容,您可以跳至下面感興趣的部分。
概述
我發現在清理從 PDF 匯入的資料時,我會回到兩種結構,我可以單獨使用它們,也可以組合使用它們。他們是:
- 標誌列:建立二進位標誌來識別滿足特定條件的行。它可以是「缺失與不缺失」、「零」與「非零」等等。標記列也可以與基於條件選擇行結合使用。
- 行下標:將一個單元格與下一個(或前一個)單元格進行比較,並使用它來產生標記列或連接連續單元格中的單元格值。使用 Row()、Row() +1、Row()-1 作為列下標(在下標括號「[ ]」之間使用)。
我還有一些經常使用的有用公式。
有用的公式:
- 缺少()
- 包含()
- 如果 ()
- 長度()
- 連接(“||”)
在這篇文章中,我將研究以下通常與匯入 PDF 資料相關的問題類型:
對於每個主題,您都會找到簡短的討論和影片。
在我們研究這些問題以及如何解決它們之前,請記住,在 JMP 中幾乎總是有多種方法可以達到相同的最終結果。但是,我將選擇 Workflow Builder 中記錄的解決方案,以使清理步驟可透過工作流程重複。通常,這意味著我將使用公式列,而不是「更快」的右鍵選項(如果可用)或使用加載項選項。以記錄每個步驟的方式設定清理步驟使我可以在需要完全相同清理步驟的其他資料表上使用工作流程。例如,請查看跨 13 頁的 PDF 表格的最終範例。將此 PDF 匯入 JMP 後,會建立 13 個表格。正如您在上一個影片中看到的,我記錄了第一個包含公式列的表的清理步驟,然後在 JMP 中循環清理步驟,將它們套用到所有 13 個表(使用 Workflow Builder 中的Group with For Each函數完成)在 JMP 18 中),這使得清潔 13 個桌子變得容易!在此處跳轉至包含 Workflow Builder 循環範例的影片。
讓我們從一個簡單的例子開始。如果您不熟悉 JMP 中的 PDF 匯入精靈,請先觀看此視頻,以了解我如何使用匯入精靈將資料匯入到 JMP pdf 中。
問題 1:由於 PDF 中合併行標題而導致儲存格值遺失。
PDF 檔案中的表格通常採用合併多行的格式並包含單一值,例如副標題。匯入到 JMP 後,表中包含空白行,而不是為包含資料的每行重複值(圖 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).圖 1:由於合併行子標題(影像左側),JMP 中的儲存格值缺失(影像右側)。
一個快速可能的清理解決方案是選擇具有缺失值的列(例如,圖 1 中的第 3 列),然後右鍵單擊單元格並選擇Fill ,然後選擇Replace Missing with Previous Value 。在 JMP 18 之前的所有 JMP 版本中,此右鍵單擊操作尚未記錄在 Workflow Builder 或進階日誌中。它將在 JMP 19 中添加,但對於早期版本,使用工作流程產生器或高級日誌中記錄的先前值來替換遺失的單元格值的更可靠選項是使用列公式。我使用了一個列公式,如果第 3 列不缺失,則在公式本身中分配一個名為“var”的變量,然後使用該值作為下一個缺失值(圖 2)。此方法非常適合替換先前的值,因為列公式是從上到下執行的。換句話說,每當第 3 列中有一個值時,變數「var」就會更新,更新後的值將用於後續行,直到非缺失行發生新的更新。
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.圖 2:用先前的值列公式取代缺失值。
請觀看我在下一個影片中示範此步驟的過程:
問題 2a:單元格值拆分為多行
PDF 表中合併行需要在 JMP 中進行清理的另一個範例是當某個值(例如子標題)被分割為一列中的多行時(圖 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).圖 3:儲存格值(在本例中為類別子標題(左))在匯入到 JMP 時被拆分為多行(右)。
為了清理這個問題,必須識別字串的各個部分,然後將其串在一起。必須為適當的行重複整個字串,然後必須刪除剩餘的部分字串。解決此問題的一種方法是建立一個 Flag 列,用於標識缺失與非缺失,或標識「下一行缺失」與「下一行未缺失」。對於圖 3 中的範例,以下是可能的步驟順序(所有步驟均顯示在圖 4 中):
- 使用「標誌」列標識包含文字的行和不包含文字的行(步驟 1)。
- 使用「標誌」列和帶有行下標的公式來識別帶有文字的行,並與下一行中的文字連接(步驟 2)。
- 一旦存在包含整個字串的單元格,請建立標誌列來標識包含部分文字字串的行並刪除這些部分字串(步驟 3 和 4)。
將空單元格的缺失值替換為整個字串(請參閱問題 1 的解決方案)。
在圖 3 的範例中,我使用了圖 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.圖 4:一系列列公式,用於尋找和更正分割為兩行的子標題。
您可以在這裡看到我演示這些步驟:
問題 2b:儲存格值拆分為多列
對於下一個範例,我使用了另一個 PDF 文件,我在此處找到了該文件。在這種情況下,儲存格值分為兩行和兩列。看一下圖5 的左圖。 ,4-亞苯基」(以藍色表示) box)不只分為兩行,而且分為兩列。發生這種情況的原因是,表的上方列出了玻璃化轉變溫度Tg 的兩個值,而不是一個,這使得列分隔線無法避免剪切化學名稱或Tg 值(請參見紅色垂直列分隔線)。
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.圖 5:熱轉變表展示了分割為多個列和行的儲存格值。
(資料來源: https
/www3.nd.edu/~hgao/Thermal_transitions_of_homopolymers.pdf)
放置列分隔線後,如圖 5 的左圖所示,Tg 列中有兩個儲存格具有屬於重複單位列的截止文字。在這種情況下,我們可以使用截斷文字是字母這一事實,而不是其他單元格中的數字。因此,解決此問題的一種方法是執行以下步驟,如圖 6 所示:
- 建立包含第一個字元的列(步驟 1)。
- 使用 Recode 平台的「替換字串」選項可以將任何數字替換為空白。為此,我使用正規表示式 [0-9-] 來尋找包括“-”在內的所有數字。 (步驟 2)。
- 使用“Ismissing”公式找到文字字串並將其與原始(截斷)字串連接(步驟 3)。
- 使用條件語句和文字標誌列清理 Tg 列。雖然這種方法有點笨拙,但它可以完成工作。如果您知道正規表示式,您也可以在列選項重新編碼下使用它。我使用了圖 7 所示的條件語句。
經過所有這些清理工作後,我確定了單元格內容在兩行中垂直分割的位置:第 39/40、41/42 和 43/44 行。被分割的單元格的字串的第一部分以“-”結尾,因此可以用作指示符。接下來,可以使用如圖 4 所示的公式結構將文字字串相加。最終,可以刪除空白資料儲存格以避免重複行。
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.圖 6:尋找並連接分割文字字串。
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.圖 7:從數字列中刪除文字字串。
下一個影片展示了我如何使用這些步驟,以便您可以看到此問題的一個可能的解決方案。
問題 3:帶有標題或子標題的行與資料混合在一起
對於最後一個範例,我回到列出了脂肪的脂肪酸組成的 PDF。在本例中,您可以看到資料表包含帶有標題、單位或子標題的行,這些行在匯入到 JMP 後,現在與資料混合在一起(圖 8)。
識別此類行的一種方法是使用「包含」公式來識別標題/單元行中實際資料中未找到的符號或文字字串。例如,在圖 8 中,我們使用公式“Contains(“%”)。如果該符號未出現在儲存格中或字串中字元的實際位置(導致整數 > 0),則該公式將導致「0」。透過簡單的條件語句,可以產生 Flag 欄位。
對於此範例,可能的公式如圖9 所示。 。接下來,刪除選取的行。進階日誌和工作流程產生器會擷取這一系列步驟,並可以將其自動化以供重複使用。請注意,“選擇位置”選單下直接提供了有限的設定選擇標準,包括“包含”,因此您可以直接進行設定並放棄“標誌”列。
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.圖 8:帶有標題或子標題的行與資料混合併在 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.圖 9:使用「Contains」公式的條件語句建立一個 Flag 列,用於標識是否存在「%」字元。
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.圖 10:使用 Flag 欄位新增條件行選擇標準。
在此影片中,您可以看到用於識別和刪除資料表中不需要的行(在本例中為副標題行)的清理步驟。
獎勵影片:使用 WorkflowBuilder 循環匯入範例
在此影片中,觀看如何只需點擊幾下即可將針對第一頁執行的所有清理步驟應用到第二頁。對於上面討論中顯示的 fat.pdf 範例,我使用 Workflow Builder 中的「Group with For Each」迴圈。接下來,我示範一個更極端的情況,其中我有 13 頁的寬表格式。每個頁面都必須單獨導入並且必須清理。然而,一旦我使用 PDF 匯入精靈從每一頁匯入表格,我就可以簡單地記錄一個表格的清理步驟。然後,我可以使用 Workflow Builder 中的「Group with For Each」選項自動對其他 12 個執行清理步驟!效率如何!
最後,我 100% 確信有更短或更簡潔的方法來解決其中一些我還不知道的問題。請隨時在下面的評論中分享其他解決方案。