我有幾個 csv 文件需要清理。相關文件有兩個基本數據塊結構。第一個塊由 1 列 7 行信息組成。第二段包含 6 列和 5 行以上的數據。
對於第一個塊,理想的轉換是將柱子分成兩部分。一件將提供列的標題或名稱。 並且,第二部分將提供有關該特定實驗的數據信息。
第二塊需要最少的干預。
到目前為止,除了一些令人煩惱的問題之外,我已經接近理想的狀態。首先,將 csv 文件分成兩部分(兩個表)不是問題。第一個數據表 –dt1- 是原始 csv 文件,從中提取數據並刪除一些行以創建第二個數據表 –dt2。第二個數據表包含1列7行;哪些需要進一步治療。
為此,我從一個新的數據表 -dt3 開始。我已成功使用 For 循環創建列標題並獲取列表的第一個元素。該信息來自dt2。下一部分是給我帶來問題的部分。我需要將列表的第二個元素傳遞或發送到 dt3 的第一行。
第一個問題:
為什麼以下行能夠更改原始數據表(dt1)中第 1 列的第一個單元格,但下一段代碼不適用於新數據表?
dt1[1,1]=300; //這有效
dt3[1,1]=300; //這不起作用。它會產生錯誤。
訪問或評估 'Assign' 時下標無效(必須是數字或數字列表),dt3[1, 1] = /*###*/300 /*###*/
第二個問題
我使用 : 作為字符標識符將前七行分隔為標題信息和行數據。這種方法的缺點是日期/時間行有 3 個這樣的字符,並且在找到第二個 : 後數據就會丟失。我怎樣才能防止這種情況發生?
有什麼想法或建議嗎? 附件中的 Excel 文件是數據表的示例。
非常感謝您的幫助
原始 csv 文件示例
菜譜: 1-濃醬 | | | |
攪拌機配方:3 速 | | | |
溫度配方:100蒸汽 | | | |
烹飪用具:不銹鋼 | | | |
批次 ID:Mini-Cake-100 | | | |
樣品 ID:Mini-Cake-100.1 | | |
日期/時間:2017 年 6 月 30 日下午 4:12:44 | | |
| | | | | |
| | | | | |
觀點 | 密度 | 糖 | 比率 | X | 是 |
1 | 5020.607 | 98.6872 | 0.9976 | 145 | 0 |
2 | 4976.009 | 98.1275 | 0.9955 | 108.75 | 0 |
3 | 4977.177 | 98.3677 | 0.9958 | 72.5 | 0 |
4 | 4982.821 | 98.2569 | 0.9957 | 36.25 | 0 |
5 | 4989.282 | 98.2105 | 0.9977 | 0 | 0 |
數據表 2 (dt2) 示例。 1 列 7 行。 : 將列名與實驗信息分隔開。
菜譜: 1-濃醬 |
攪拌機配方:3 速 |
溫度配方:100蒸汽 |
烹飪用具:不銹鋼 |
批次 ID:Mini-Cake-100 |
樣品 ID:Mini-Cake-100.1 |
日期/時間:2017 年 6 月 30 日下午 4:12:44 |
dt2 的所需轉換。
食物食譜 | 攪拌機配方 | 溫度配方 | 烹飪五金 | 批次編號 | 樣品編號 | 約會時間 |
1-濃醬 | 3速 | 100蒸汽 | 防鏽的 | 迷你蛋糕-100 | 迷你蛋糕-100.1 | ######### |
JSL代碼
<BR />
Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
Close All(Journals, No Save);
//***********************************************************************************************************************************************************
/*Open collected data from a share drive
and assign working data table(s) -->dt1
*/
dt1 = Open(
"C:\Users\...................filename.csv",
columns(
Column( "c000001", Character, "Nominal" ),
Column( "c000002", Character, "Nominal" ),
Column( "c000003", Character, "Nominal" ),
Column( "c000004", Character, "Nominal" ),
Column( "c000005", Character, "Nominal" ),
Column( "c000006", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
//The raw data table repeats information every 48 rows
//This table separates each item into individual tables
//The generated table does not have formated column headings
//For(i=1, i <=x, i++, //this For loop is ignored for now until dt2 --> dt problem is solved
selrows =dt1 <<SELECT rows=""></SELECT>
您的第一個問題是 dt3 數據表中沒有行。 如果你添加
dt3 << add rows(N Rows( dt2 ));
創建 dt3 後,您將能夠填充該表。
第二個問題是,您想要的不是字符串的第二個單詞,而是第一個“:”之後的所有內容。 因此,使用 Substr() 函數效果會更好:
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )