我在主資料資料夾和 95 個不同的子資料夾下保存了大約95 個具有不同列名稱的csv 文件,例如\data\dataset1\dataset1.csv、\data\dataset2\dataset2.csv 等。id1 和id2 列是跨域的公共變數全部檔。 我想做以下事情:
- 將所有 95 個 csv 檔案匯入到 JMP(使用 JMP Pro 16)
- 根據所有 95 個檔案的條件更新值: if (id1 = 'a001' then id2='b001')
- 將更新的 csv 檔案以不同的名稱保存在各自的資料夾中
第一行是文件標題,無法刪除。 列/變數名稱從第 2 行開始,資料從第 3 行開始。
我設法通過以下方式導入所有文件:
dt:多個檔案導入(
<<設定資料夾(
“C:\數據\”
),
<<設定顯示隱藏( 0 ),
<<設定子資料夾( 1 ),
<<設定名稱過濾器("*.csv"),
<<設定名稱啟用(1),
<<設定大小過濾器( {522, 2096152} ),
<<設定大小啟用(0),
<<設定日期過濾器( {3715322235, 3718948571} ),
<<設定日期啟用(0),
<<設定新增檔案名列( 0 ),
<<設定新增檔案大小列( 0 ),
<<設定新增檔案日期列( 0 ),
<<設定導入模式(“CSVData”),
<<設定字元集(“最佳猜測”),
<<設定堆疊模式(「每個檔案表」),
<<設定 CSV 有標題( 1 ),
<<設定 CSV 允許數字( 1 ),
<<設定 CSV 第一標題行( 2 ),
<<設定 CSV 標題行數( 1 ),
<<設定 CSV 第一資料行( 3 ),
<<設定 CSV EOF 逗號( 1 ),
<<設定 CSV EOF 選項卡( 0 ),
<<設定 CSV EOF 空間( 0 ),
<<設定 CSV EOF 空格( 0 ),
<<設定 CSV EOF 其他( "" ),
<<設定 CSV EOL CRLF(1),
<<設定 CSV EOL CR(1),
<<設定 CSV EOL LF( 1 ),
<<設定 CSV EOL 分號( 0 ),
<<設定 CSV EOL 其他( "" ),
<<設定 CSV 報價( "\!"" ),
<<設定 CSV 轉義(""),
<<設定XML方法(“猜測”),
<<設定 XML Guess(“巨大”),
<<設定 XML 設定( XML Settings() ),
<<設定JSON方法(“猜測”),
<<設定 JSON 猜測(“巨大”),
<<設定 JSON 設定( JSON Settings() ),
<<設定導入回呼( Empty() )
) << 導入資料;
在此程式碼中,沒有用於確定列名稱和資料開始位置的公式。
然後,我嘗試使用以下方法更新值:
dt: subjid <<
:id1 << 設定公式(
如果(:id2 ==“a001”,:id1 ==“b001”)
);
結果,id1 欄位中「a001」之前的值將被刪除,並且「a001」的 id1 值不會更新。
我處於這個階段,甚至無法想到下一階段將文件以不同的名稱保存在各自的資料夾中。 非常感謝任何幫助/指導。
謝謝
謝謝,為此發表了一篇文章,因為它看起來通常很有用,而且其中一些內容並不明顯如何操作。
MFI 更新 CSV
謝謝克雷格。 正如您所提到的,第二個範例效果很好。 但是,它僅在我打開或匯入一個 CSV 時有效,但在匯入多個 CSV 時無效。 另外,您能否指導我完成將 csv 寫回具有不同檔案名稱的各自資料夾的最後階段?
謝謝你,
海拉爾
我不確定你的 JSL 做了什麼:
dt: subjid << :id1 << Set Formula( If( :id2 == "a001", :id1 == "b001") )
<<「傳送」運算子只能出現一次,要新增公式的欄位應該位於左側。 然後,在 if 語句中,應該有一個條件,後面跟著一個表示 true 情況的值,以及表示 false 情況的另一個值。 像這樣的東西
dt << New Column( "likes",
"character",
formula( If(
Is Missing( name ), // first test
"unknown", // if first test is true
name == "KATIE", // second test
"cats", // if second test is true
"dogs" // if second test is false
)
)
);
其目的是根據列名稱中的值建立貓或狗的新公式列。 若名稱為空(缺失),則為「未知」。
或者,如果您的目標是根據其他列的值覆蓋現有列,則明確循環可能比公式列更好:
foreachrow(dt,
if(
name == "DANNY", // a test with ==
name = "Dani"; // an assignment with =
sex = "F";
, /* else if */ name == "ROBERT",
name = "Roberta";
sex = "F";
);
);
(如果秘密可能有助於理解逗號和分號。 ) 除非名稱匹配,否則行保持不變。
請注意這兩個範例有何不同:
第一個範例必須在 if(...) 中產生一個答案,該答案將指派給公式的欄位。 如果該行的列應保持不變,則公式的值必須是該行的原始值。編輯:抱歉,這是錯的。 只需確保公式列為每一行產生一個值即可。
第二個範例僅更新它選擇的行和列。
由於您計劃寫出 CSV 檔案(而不是保存 JMP 檔案),因此您新增到列的公式表達式將不會被保存(儘管公式中的更新值會被保存。)我認為您可能想要更像第二個例子。