我有大约 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 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 文件),因此您添加到列中的公式表达式将不会被保存(尽管公式中的更新值将会被保存。)我认为您可能想要更多类似的内容第二个例子。