合并多个 txt 或 csv 文件此脚本会将多个 txt 或 csv 文件合并为一个文件。 该脚本请求目标目录,打开第一个文件,然后使用表连接函数迭代地将后续文件添加到第一个文件。最终文件中将创建一个新列:该列将包含每一行所来自的文件的名称。 如果所有文本文件具有相同(相同)的列名称,则这些列将全部堆叠(连接)在一列中。 唯一的列也将被转移到最终文件中。
该脚本有几个被注释掉的部分,脚本的这些部分可用于组合多个 Excel 文件。 合并 Excel 文件时,假设这些 .xls 或 .xlsx 文件只有一个工作表。
--------更新于2016年6月1日
我对这个脚本有一个有趣的问题。 有人有一堆 CSV 文件,其中列名称位于第二行,更糟糕的是,列名称以分号分隔,而文本以逗号分隔。处理此问题的一种方法是将导入设置添加到脚本中。这是我很高兴 JMP 为我撰写的内容之一。我手动打开并导入该文件(使用“文件”>“打开”>“打开并预览”),然后在对话框中将列设置为从第二行开始,并添加“;”的“其他”分隔符。导入文件后,我转到源脚本并找到“导入设置”参数。
为了使脚本打开此文件,我添加了一个表达式 importset=expr(import settings(...在此处粘贴脚本...));靠近脚本顶部的位置。 (它是一个表达式,因为在我稍后打开文件时需要它们之前,评估导入设置是没有用的。)
然后在底部附近,我将表达式添加到 open 参数 open(filename,importset)。
重要提示:如果您要使用导入过滤器下载第二个脚本,并希望它能够自动处理格式不常见的 CSV 表。它只是行不通,您必须创建自己的导入设置并将它们替换为此处的设置和示例。
--------不久前还有一个关于如何在 MAC 上运行此功能的问题。
我添加了另一位,以便它也可以在 Mac 上运行(这意味着我没有在 PC 上测试它)
If( Host is( Mac ),
filepath="/"||prefilepath,
filepath = Convert File Path( prefilepath, Windows )
);
-----2016 年 10 月 10 日更新
Justin C 注意到带有多个“.”的文件名效果不太好,并建议将“item”更改为 -1,以便使用文件扩展名而不是第二个项目作为文件扩展名。 很好的修复,也是处理文件名时要记住的一个重要想法。 谢谢贾斯汀!
公用事业回复:合并多个 txt 或 csv 文件我发现在我的例子中,列并不总是正确连接。有人可以帮忙吗?
我有一堆文件想要连接,但列顺序偶尔会发生变化,如下所示:
文件1-3
列顺序(A、B、C、D、E、F、G)
文件 4-100
列顺序(A、B、C、D、E、 H ,F,G)
文件 101-1000
列顺序(A、B、C、 K ,D,E, H ,F,G,我, J )
我想合并所有这些文件,并确保每列的数据始终位于最终表中的相应列中。我还想保留所有数据(不要删除 K 列,只需将 K 列不存在的所有行保留为空白)。任何帮助将不胜感激!
回复:合并多个 txt 或 csv 文件有没有办法在此脚本中添加标头?我有大约 20,000 个包含没有标题数据的文件
回复:合并多个 txt 或 csv 文件你好,
我是 JMP 脚本编写的新手。 由于某种原因,当我合并多个文本文件时,导入设置对我不起作用。 我可以看到串联文件。 在我的例子中,列名从 11 开始,数据从 12 开始。 但合并文件从第 1 列开始,而不是从第 11 列开始。 请告诉我我错过了什么?
谢谢
回复:合并多个 txt 或 csv 文件我为此创建了一个解决方法,其中涉及将文件复制到临时目录并重命名它们。 我看不到任何附加文件的方法,所以这是代码
names default to here (1);
Clear Symbols();
//Import settings, sometimes CSV files aren't exaclty formatted as CSV. Add import settings
//This is an expression to use later in the Open argument.
//Column names start on the second row, and are semicolon delimited
importset=expr( Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, Other( ";" ), CSV( 0 ) ),//use ";" as a delimiter too
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 2 ),//starting on second row
Data Starts( 3 ),//data starts on 3rd row
Lines To Read( "All" ),
Year Rule( "20xx" )
));
//set up variables with starting values
filelist={}; //empty list
//launch dialog to get the file location
prefilepath = munger(Pick Directory( "Browse to the Directory of the .txt / .csv files " ),1,"/","");
If( Host is( Mac ),
filepath="/"||prefilepath,
filepath = Convert File Path( prefilepath, Windows )
);
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "txt" | Item( 2, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);<BR />
nf=nitems(filelist); //number of items in the working list
tempDir = "$TEMP\JMP\";
Create Directory(tempDir); //create the temp folder in the "%temp%" windows directory
//for each .csv file found on the server
For( i3 = 1 , i3 <= nf, i3++,
copyFileName = filelist[i3];
csvPos = Contains(filelist[i3],".csv"); //determine where in the filename .csv is
newFileName = Left(copyFileName, csvPos + 3 ); //determine the filename without the extra bits after .csv
Copy File (filepath||filelist[i3], tempDir||copyFileName);//copy the file to the temp folder
Rename File (tempDir||copyFileName, newFileName);//rename the file without the extra bits after .csv
filelist[i3] = newFileName; //replace the reference in the array to this file
);//end of the for loop
cctable= New Table( "Combined data table ");//make an empty table
cctable<<NEW column=""></NEW>回复:合并多个 txt 或 csv 文件我在运行它时遇到了一些麻烦。我认为问题是我使用的文件本质上是逗号分隔的文本文件,但具有 .log 扩展名。
我将 txt 更改为您代码中的日志:
Item( -1, prefilelist[i2], "." ) == "日志"
我收到一个错误
Send 在访问或评估 'Send' 时期望可编写脚本的对象,dt << /*###*/Run Formulas() /*###*/
在:
dt<< 运行公式();
如果我将文件的扩展名更改为 .txt,它就可以工作。然而,我有数千个文件想要合并,并且每天都会添加数十个文件。 有没有办法让它与具有 .log 扩展名的文件一起使用?
第二个问题。
我的文件中没有标题。有没有办法合并文件然后将标题添加到数据表中?目前,它采用第一个文件的顶行并将其作为标题,即所有数据。
谢谢你的帮助。
回复:合并多个 txt 或 csv 文件只是想说谢谢拜伦。 这是一个很好且实际的例子。
这个脚本节省了我很多时间!
该脚本在几秒钟内完成了我花费数小时工作的事情。
谢谢你!!!
回复:合并多个 txt 或 csv 文件<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />同样的方法也适用于“join”。 只需尝试用 join 参数替换 concat 参数即可。(手动执行连接,然后复制结果表中的源脚本,以获取连接参数的示例
回复:合并多个 txt 或 csv 文件有没有简单的方法可以使用 JOIN 并排组合多个 txt 或 csv 文件,而不是垂直组合连接在合并txt Tables.jsl ?
回复:合并多个 txt 或 csv 文件嗨拜伦,这个脚本效果很好。 我稍微修改了一下,从打开的文件中选择数据的子集,添加列,将字符更改为数字等。我有一个问题,是否有一种简单的方法来修改脚本以指定文件所在的文件夹弹出提示?
谢谢
TS
回复:合并多个 txt 或 csv 文件该脚本无法在我的系统上运行:Mac OS X 10.10.5 + JMP Pro 12.1.0
回复:合并多个 txt 或 csv 文件是的,负引用很方便,它适用于几乎所有引用字符位置的函数,以及某些您可能意想不到的地方;例如,想象一下有 -1 位小数。
回复:合并多个 txt 或 csv 文件嗨,布莱恩和大家,
我能够添加一个小更新:从源列名称中删除 .csv 或 .txt 等尾随文件扩展名:
所以在最后一节而不是:
设置每个值(filenow)
我补充道:
设置每个值(删除(filenow,-4,-1))
我很惊讶负面参考竟然起作用了!
回复:合并多个 txt 或 csv 文件嗨拜伦,
不错的脚本,在 JMP 12 中就像魅力一样。 想知道一种从特定行开始读取源数据文件的好方法,如果愿意的话,可以截断标题信息。例如,如果所有源文件格式都相同,则从以“CH”一词开头的行开始?
回复:合并多个 txt 或 csv 文件你好拜伦,
它只发生在这个脚本中。 运行脚本后,它在日志窗口中显示“NItem()”空白错误。 所以我只需复制整个脚本并将其粘贴到新的脚本窗口中,然后它就可以正常运行了。
谢谢
回复:合并多个 txt 或 csv 文件我不确定我是否理解这个问题。 其他脚本是否会复制此行为?
回复:合并多个 txt 或 csv 文件嗨拜伦,
感谢您提供这个有价值的脚本。 我正在使用此脚本添加多个 .txt 文件。 但它是在将相同的脚本复制到新脚本后运行的。 我想问为什么在第一次尝试打开相同的脚本时它没有运行。 感谢您提前的答复。 这个脚本非常有帮助。
回复:合并多个 txt 或 csv 文件肖恩,
在 MAC 上,选择目录或选择文件的对话框窗口是相同的。 该脚本要求您识别包含 csv 和/或 txt 文件的目录。 该脚本当前允许连接文件列表中的 csv 和 txt 文件。 如果您希望它更具限制性,那么只需编辑出您希望从脚本的这一部分中排除的文件类型即可。
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "txt" | Item( 2, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
如果脚本返回所选目录中的文件扩展名列表,然后让用户检查要添加到 filelist 变量的文件类型,那就太酷了。
如果您有时间编写一些脚本,请发布升级后的脚本!
此致,
拜伦
回复:合并多个 txt 或 csv 文件布莱恩,
我在 OS X 10.10.2 上使用 JMP 10.0.0。 当我运行用于选择文件的脚本时,将会启动一个窗口。 但是,我无法在启动的窗口中选择任何 .txt 或 .csv 文件。 我不确定该脚本是否需要针对 JMP(OS X 版本)进一步修改。 你能帮忙解决这个问题吗? 谢谢。
肖恩
回复:合并多个 txt 或 csv 文件谢谢,我现在明白了。
回复:合并多个 txt 或 csv 文件戴尔,
您介意再检查一下附件吗?
我重新附上它。
——拜伦
回复:合并多个 txt 或 csv 文件脚本在哪里?我似乎无法在任何地方找到它。