我有大約 95 個具有不同列名的 csv 文件保存在主數據文件夾和 95 個不同的子文件夾中,如 \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 猜測(“巨大”),
<<設置 XML 設置( XML Settings() ),
<<設置JSON方法(“猜測”),
<<設置JSON猜測(“巨大”),
<<設置 JSON 設置( JSON Settings() ),
<<設置導入回調( Empty() )
) << 導入數據;
在這段代碼中,沒有列名和數據從哪裡開始的公式。
然後,我嘗試使用以下方法更新值:
dt:subjid <<
:id1 << 設置公式(
如果(:id2 == "a001", :id1 == "b001")
);
結果,id1 列中“a001”之前的值被刪除,“a001”的 id1 值不會更新。
我在這個階段存貨,甚至想不到下一階段在各自的文件夾中以不同的名稱保存文件。 非常感謝任何幫助/指導。
謝謝
我不確定你的 JSL 做了什麼:
dt: subjid << :id1 << Set Formula( If( :id2 == "a001", :id1 == "b001") )
<< "send" 運算符應該只出現一次,並且您要添加公式的列應該是左側。 然後在 if 語句中,應該有一個條件,後跟一個表示真情況的值,和另一個表示假情況的值。 像這樣的東西
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 文件),您添加到列中的公式表達式將不會被保存(儘管公式中的更新值將被保存。)我認為您可能想要更像第二個例子。
謝謝克雷格。 正如您所提到的,第二個示例運行良好。 但是,它僅在我打開或導入一個 csv 時有效,但在導入多個 CSV 時不起作用。 另外,請您指導我也完成將csv寫回具有不同文件名的各自文件夾的最後階段嗎?
謝謝,
海拉爾
謝謝,為它發了一個帖子,因為它看起來通常很有用,而且其中一些並不是很明顯該怎麼做。
MFI 更新 CSV