如何使用递归连接文件夹中的 CSV 文件?你好,有人可以帮我修改这段代码吗?我正在尝试连接每个文件夹的 csv 文件。 用户必须选择一个文件夹,所有符合条件的 csv 文件夹将根据文件夹名称连接并保存。 此方法使用户在每次脚本运行时选择一个文件夹。
但是,我现在想做的是让用户选择主文件夹,然后运行脚本并连接每个子文件夹的数据(像前面的方法一样,使用其文件夹名称作为文件名单独保存它们)。
但通过这些代码,所有 csv 文件都被连接成一个文件。 你能帮忙修改和解释递归是如何工作的吗? 如何通过打开主文件夹来单独保存这些文件(连接每个文件夹的数据)。 我正在使用 JMP 15。 谢谢
p = pick Directory("Select a Folder");<BR />//f = Files In Directory(p);
f = Files In Directory(p, recursive(1));
Dir = Word(-1, p, "/"); //get filename
saveDir = Substr( p, 1, Length( p ) - Length( Word( -1, p, "\/" ) ) - 1 ); //save file outside main folder
/* Removes the file names from the list f which are not CSV files */
for(j=1,j<=N Items(f),j++,
If (Substr(f[j],Length(f[j])-2,3)!= "CSV",
RemoveFrom(f,j,1);
j=j-1;
);
);
A = {}; /* creates a empty list for storing the names of each data table */
B = {};
C = {};
D = {};
k = {};
m = {};
/*Opens each one of the CSV files and deletes all unwanted rows */
for(j=1,j<=N Items(f),j++,
CSV = Open(Concat(p,f[j]), End of Field(comma), Strip Quotes(1), Labels(1),
Column Names Start(3), Data Starts(4), Columns(:MRR=Numeric));
colname = {};
colname = CSV<<GET column="" names="">20 & Contains(colname,"Weight")>50,
InsertInto(A,CSV);
CSV<<SELECT where="">1,
dt2 = dt1<<CONCATENATE>1,
dt3 = dt1<<CONCATENATE></CONCATENATE></CONCATENATE></SELECT></GET>自动化和脚本编写回复:如何使用递归连接文件夹中的 CSV 文件?关于 recursive(1) 选项,您需要解释什么?
Names Default To Here(1);
Files In Directory("$SAMPLE_DATA", recursive(1));
如果没有该选项,您将仅获得文件夹中的第一级文件,而使用递归时,您还将获得其中的子文件夹和文件。

突出显示的部分只是因为设置了 recursive(1) 。
关于您的脚本:您有多少层文件夹?它可能会改变吗? 如果在找到 .csv 文件之前存在多个级别,则文件名应该是什么?
回复:如何使用递归连接文件夹中的 CSV 文件?这是一个入门脚本,它读入所有递归文件并根据它们所在的文件夹将它们连接到单独的数据表中。
我没有包含您所有的个人错误检查等。您应该能够修改我的示例以将这些内容放回代码中。
此代码存在结构差异。JSL 读入一个文件,然后在读入下一个文件之前将其连接起来。我尽可能多地检查了,但仍然可能有问题。
names default to here(1);
p = pick Directory("Select a Folder");//f = Files In Directory(p);
f = Files In Directory(p, recursive(1));
for(i=nitems(f),i>=1,i--,
if(uppercase(word(-1,f[i],"."))!="CSV",
remove from(f,i,1)
)
);
// Create the Associative Array with all of the files, with their directories
// Place all data into a data table, and then move into an Associative Array which will give the
// folder(data table to concatenate to)
dt= new table("The Files", new column("File", character));
dt << add rows(nitems(f));
dt:file<<SET values=""></SET>回复:如何使用递归连接文件夹中的 CSV 文件?您好,我只有两层文件夹(主文件夹),然后是包含 CSV 的多个文件夹。 以下是不使用递归的脚本输出示例。 我想要做的是,当脚本运行时,仅选择主文件夹,并且脚本将具有如下输出。

回复:如何使用递归连接文件夹中的 CSV 文件?您可以使用带有负索引的 Word() 轻松获取文件夹名称。 下面的例子
Names Default To Here(1);
foldername = Word(-1, "F1/1.jmp", "/\"); //"1.jmp"
我很可能会创建一个关联数组,其中键是文件夹名称。 然后我将循环遍历文件列表并检查关联数组中是否尚不存在该文件夹,然后将其添加到那里并将其值初始化为空列表。 然后,您可以使用 insert into 将文件路径添加到该关联数组以更正键(使用完整路径,以便更容易打开文件)。 查看完文件列表后,对关联数组执行其他循环。 这次打开文件并将它们连接起来
回复:如何使用递归连接文件夹中的 CSV 文件?您好,我在这行代码中有一个问题,因为我仍在使用 JMP 15。 我如何将其转换为 JMP 15(for 循环格式) 我对 JMP 15 中的 for 循环格式中的 {table} 是什么感到有点困惑。 另外,我怎样才能相应地保存这个 CSV 文件呢? 就我的例子来说,是按性别划分的。 因此文件名应按性别保存(Male.csv & Female.csv)
For Each( {table}, theArray << get keys,
stable = theArray << get value( table );
stable = Substitute( stable, ":", "-" );
stable = Substitute( stable, "/", "-" );
If( Try( Data Table( stable ) << get name, "" ) == "",
dt = New Table( theArray << get value( table ) ),
dt = Data Table( stable )
);
回复:如何使用递归连接文件夹中的 CSV 文件?我认为这应该有效:
arrayKeys = theArray << get keys;
For(i=1, i <=nitems( arrayKeys), i++,
table = arrayKeys[i];
stable = theArray << get value( table );
stable = Substitute( stable, ":", "-" );
stable = Substitute( stable, "/", "-" );
If( Try( Data Table( stable ) << get name, "" ) == "",
dt = New Table( theArray << get value( table ) ),
dt = Data Table( stable )
);