在我之前的部落格文章中JMP 和 Excel - 一個永無止境的故事? - 第1部分最後我舉了一個導入帶有分層標題和合併單元格的電子表格的範例。 這次我專注於匯入包含許多工作表的電子表格檔案以及將多個電子表格(位於特定資料夾中)讀取到 JMP 中。 我不想讓它變得過於複雜,因此我假設電子表格中以及不同工作表中的結構和參數名稱是相同的!
(注意:如果不相同,您必須指定每個工作簿的設定並將它們作為單獨的表匯入。 隨後可以透過使用聯接/串聯功能或 JMP 資料表的 JMP 查詢產生器來將它們組合起來。 如果您想自動化這些類型的步驟,通常需要進一步編寫腳本來檢查您想要讀入的每個變數、工作表和/或檔案的角色。
多個工作表 - 匯入和自動化
那我們先來看看Excel中的資料:

人們可以看到不同的工作簿,它們都具有相同的形狀和不平凡的結構。 紅色底線可以看到每個工作簿上不同的批號。 我想讀入數據,但不想讀入單獨的表中。 相反,我希望擁有一個表,並使用 JMP 的 Excel 匯入精靈,這很容易實現:
- 將 Excel 工作表拖曳到任意 JMP 視窗中將開啟 Excel 匯入精靈:

- 根據需要更改標題和資料欄位的設定。 我們有一個不想包含在資料中的標題,實際標題從第 4 行開始,跨越三行。 然後有一行空白字段。 因此,我們在一行後開始數據(8 而不是 7)。 第一列沒有用於分析的數據,這就是我們跳過它的原因。

- 點擊“下一步”按鈕,我們可以使用最後一行設置,告訴我們不想包含時間戳資訊。 選擇資料結束的行並按加號 (+),您不必關心哪個行號是正確的。

- 剩下的事情是在所有工作表中使用相同的結構。 我們可以檢查“用於所有工作表”以及“連接工作表並嘗試匹配列”標記。 這會將預覽從 30/30 行更改為 90/90 行。 考慮到三個工作表中的每一個都提供 30 行,這似乎按預期工作。 連線時,強烈建議同時勾選「連線時使用工作表名稱建立列」標誌。 否則以後將很難反映數據的來源。
- 最後一步是導入,當然要永遠檢查導入的數據
如果你想看看它的實際效果,我可以推薦這個短片(使用 JMP 12)。 如果您剛開始使用匯入精靈,請注意:它將保存最後的設置,這可能會在匯入新的但不同的資料時導致令人驚訝的資料視圖。 使用“恢復預設設定”按鈕,您可以在精靈中重設設定。
在每個匯入的資料表中,您將找到一個來源腳本,用於使用您先前選擇的設定重做匯入。 這允許讀取更新的資料表,以防您在電子表格中獲得新的批次資料。 嗯,當經常收集數據時,我可能會考慮使用資料庫而不是電子表格,但這是一個不同的故事。
自動匯入多個電子表格 - 不同的挑戰
現在您知道如何將一個包含多個具有相同結構的工作表的電子表格讀取到 JMP 中。 然而,您可能還面臨這樣的挑戰:「如何將具有相同結構的多個電子表格讀取到 JMP 中,而無需為每個檔案手動執行此操作,即自動執行此操作。 簡短的回答是,使用 JMP 腳本語言。 使用來源腳本作為基礎,您可以為每個電子表格重新執行此腳本,也可以使用 for 迴圈遍歷資料夾中的所有檔案。 您可以使用社群文件交換中共享的一個腳本(也許需要進行一些調整),它正是執行以下操作:合併多個 txt 或 csv 文件
簡而言之,您執行以下步驟(僅顯示腳本的一部分):
- 選擇目錄並過濾 Excel 文件
prefilepath = munger(Pick Directory( "Browse to the Directory of the Target Excel Files " ),1,"/","");
filepath = Convert File Path( prefilepath, Windows );
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-Excel files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "xls" | Item( 2, prefilelist[i2], "." ) == "xlsx",
Insert Into( filelist,file),
//show(file)
)
);
- 循環遍歷文件並導入它們。 為了節省內存,只需打開兩個表並用新表更新第一個導入的表,關閉後者並打開下一個。 否則,您可能會在 Windows 上遇到問題,因為使用的視窗句柄數量以及記憶體(在電子表格很多或非常大的情況下)。
n=nitems(filelist); //number of items in the working list
cctable= New Table( "Combined data table");//make an empty table
ExcelSheetName = "Sheet1"; // change this if you have a special sheet name you want to read the data from
//Iterate through building the SQL string to query the Excel files
For( i = 1, i < n+1, i++,
filenow = ( filelist[i] );
fileopen=(filepath||filenow);
dt=open(fileopen, Worksheets( ExcelSheetName ) );
dt << New Column( "File Name", formula( filenow ) );
cctable << Concatenate( Data Table( dt ), Append to first table );
Close( dt, NoSave );
);//end of for loop
到目前為止,您已經了解了匯入簡單結構化資料的多種方法,以及如何使用 JMP 中的 Excel 匯入精靈處理分層和/或合併資料集。 最後,我向您展示了一次匯入多個工作表的方法以及如何使用 JSL 腳本自動讀取多個 Excel 工作表。 在我的下一篇文章中,我將討論基於資料格式和其他格式的潛在挑戰。
我期待您的評論和分享經驗。