我有大约 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