Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改如果可以提供一个示例(如果有不同类型,则提供几个示例).csv 文件,这将使这一过程变得更容易。 如果没有,您能否提供一张“损坏”的数据表?
Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改我附上示例表供您参考
导入多个CSV文件,但部分标题格式错误需要通过JSL修改我正在尝试导入多个CSV文件,“导入多个文件”功能无法正常工作,因为原始数据列名称格式有两个问题,会导致标题和数据不匹配
1.数据列名称如下:日期时间名称(ABC)(DEF)身高体重......等
2.我需要的dilim是空间和(和)
3. 但是,“Date”之前有额外的空格或制表符,因此第一个列名称变为“Column 1”而不是“Date”,并且标题与数据相比右移一列
4.第二个错误是(D,这两列之间没有空格,因此将它们视为一个标题,但数据被分成(和D两列,因为中间有空格,所以标题会左移一列与数据进行比较
5. 第一个错误始终存在于第一个列名称“Date”之前,但第二个错误“(D”可能会根据源工具以不同的顺序出现
我想编写一个 JSL,以便它可以自动匹配所有标题和列,但不知道如何执行此操作:
我想第一步是使用 Get Column Names() 然后解析名称,但 parse() 和 word() 似乎不起作用。
我被困在这里,编码真的很生疏,提前感谢您的帮助

自动化和脚本编写Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改基于两行示例,我很可能会清理 .csv 文件(删除 () 并折叠空格),然后使用 Open with Char to Blob() 将“固定”字符串转换为数据表
Names Default To Here(1);
str = Load Text File("$DOWNLOADS/sample CSV.csv");
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
str = Concat Items(data, "\!N");
dt = Open(Char To Blob(str),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Scan Whole File(1),
Treat empty columns as numeric(0),
CompressNumericColumns(0),
CompressCharacterColumns(0),
CompressAllowListCheck(0),
Labels(1),
Column Names Start(1),
First Named Column(1),
Data Starts(2),
Lines To Read("All"),
Year Rule("20xx")
)
);Re: 导入多个CSV文件,但有些标题格式错误需要通过JSL修改@jthi
你的解决方案太棒了!
一个问题。您要从每行中删除括号的行,您指定
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
将所有“(”替换为“)”,然后将所有“)”替换为“”。
我的老派方法是:
str = Collapse Whitespace(Substitute(line, "(", "", ")", ""))
其中“(”替换为“”,然后“)”替换为“”。
您的语法有优势还是只是个人选择?
Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改这只是我个人的选择。 通常,当我想用同一事物替换多个事物时,我会提供替换要替换的值的列表,然后提供一次值。 如果我想用不同的东西替换它们,我会使用您展示的方法,或者如果我必须动态构建它/有配置文件,我将使用两个列表
Names Default To Here(1);
str = "AA BB CC DD";
a = Substitute(str, {"AA", "BB"}, "11"); // a = "11 11 CC DD";
b = Substitute(str, "AA", "11", "BB", "22"); // b = "11 22 CC DD";
subs = ["AA" => "33", "BB" => "44"];
c = Substitute(str, subs << get keys, subs << Get Values); // c = "33 44 CC DD";
show(a, b, c);Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改感谢您的支持,此方法适用于单个文件
但我还有一个问题,我有很多相同格式的文件需要作为一个 JMP 文件导入。
所以看来这种方法需要我将它们一一打开,然后并入一个文件
这就是为什么我最初的想法是:
1.使用多重导入功能
2. 获取列名
3.然后使用recode列名功能修改各个列名
Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改是否有某些具体原因导致您无法执行以下操作
- 获取您感兴趣的文件列表
- 使用 For Each 循环它们
- 在循环内解析文件并将它们连接到您首先打开的表中
您也可以尝试修复列,但根据您的示例,修复 csv 文件比导入值后开始弄乱列名称和/或移动值要容易得多
Re: 导入多个CSV文件,但有些标题格式错误需要通过JSL修改修复生成该文件的程序也可能是一个不错的选择。 这不是标准的 CSV,我认为任何其他程序也无法正确解析它。
Re: 导入多个CSV文件,但有些标题格式错误需要通过JSL修改连接数据表展示了一种方法
Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改我尝试使用 for 循环来循环文件,但它不起作用,看起来当我尝试连接它们时出现问题
Names Default To Here(1);
dir = Pick Directory("Select a directory");
filelist = Files In Directory(dir);
strings = {};
For(i = 1, i <= N Items(filelist), i++,
file = dir || Eval(Parse(filelist[i]));
str = Load Text File(file);
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
str = Concat Items(data, "\!N");
strings = strings || str;
);
dt = Open(
Char To Blob(str),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Scan Whole File(1),
Treat empty columns as numeric(0),
CompressNumericColumns(0),
CompressCharacterColumns(0),
CompressAllowListCheck(0),
Labels(1),
Column Names Start(2),
First Named Column(1),
Data Starts(3),
Lines To Read("All"),
Year Rule("20xx")
)
);
Re: 导入多个CSV文件,但有些标题格式错误需要通过JSL修改经过多次尝试,下面的代码成功地通过循环导入了多个CSV,并且格式正确。
但我仍然有两个问题:
1.从第二个文件开始,标题不排除为列标题,它们被视为表中的数据,标题有两行,第一行是文件名,第二行是标题,以空格分隔
2.我想添加文件名列,以便我可以分析不同的文件,但这不是像导入多个文件功能一样可以轻松实现吗?
名称默认为此处( 1 );
dir = 选择目录( "选择目录" );
filelist = 目录中的文件( dir );
我的列表= {};
For( i = 1, i <= N Items( 文件列表 ), i++,
文件=目录|| “/”||文件列表[i];
str = 加载文本文件( 文件 );
行=单词(str,“\!N”);
数据 = 变换每个({行}, 行,
行=折叠空白(替换(行,{“(”,“)”},“”))
);
moddedstr = 连接项目(data, "\!N");
mylist[i] = 修改的str;
);
dt = 打开(
Char To Blob( Concat Items( mylist, "\!N" ) ),
导入设置(
行尾( CRLF, CR, LF ),
字段结束(空格、空格、CSV( 0 ) )、
剥离报价( 1 ),
使用撇号作为引号(0),
使用区域设置( 0 ),
将空列视为数字 ( 0 ),
压缩数字列( 0 ),
压缩字符列( 0 ),
压缩允许列表检查( 0 ),
标签( 1 ),
列名开始( 2 ),
第一个命名列( 1 ),
数据开始( 3 ),
要读取的行(“全部”),
年份规则(“20xx”)
)
);
Re: 导入多个CSV文件,但有些标题格式错误需要通过JSL修改不要创建一个庞大的字符串,而是一张一张地创建数据表,然后将它们连接起来。 另外,在发布 JSL 脚本时请使用“插入 JSL 脚本”
因为它使它更容易阅读。
</CODE></PRE>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/60013iEF81464ED8426C0C/jthi_2-1703167262034.png" role="button" title="jthi_2-1703167262034.png" alt="jthi_2-1703167262034.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-711549" slang="en-US" mode="NONE">Re: 导入多个CSV文件,但部分标题格式错误,需要通过JSL修改</LINGO-SUB><LINGO-BODY id="lingo-body-711549" slang="en-US" mode="NONE"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A>是正确的,但如果您想继续连接字符串,则需要进行一些更改。<STRONG>如果串联的字符数 >2GB,此操作将会失败,因为这是 JMP 可以处理的最长字符串。</STRONG></P>
<P>主意:</P>
<PRE><CODE class=" language-jsl">
For( i = 1, i <= N Items( filelist ), i++,
file = dir || "/" || filelist[i];
str = Load Text File( file );
lines = Words(str, "\!N");
header1 = RemoveFrom(lines, 1); // remove the first line, two times.
header2 = RemoveFrom(lines, 1); // (removes both header lines.)
data = Transform Each({line}, lines,
// prepend the file name to each data line
filelist[i] || " " || Collapse Whitespace(Substitute(line, {"(", ")"}, ""));
);
modifiedstr = Concat Items(data, "\!N");
mylist[i] = modifiedstr;
);
header2 = "filename" || header2; // add the column name "filename"
insertInto(mylist,header2,1); // check the order of the arguments, the goal
insertInto(mylist,header1,1); // is to push these onto the front of the list
// now do the import...Names Default To Here(1);
dir = "$DOWNLOADS/New Folder (7)";
filelist = Files In Directory(dir);
mylist = {};
dt_collector = Empty();
For(i = 1, i <= N Items(filelist), i++,
file = dir || "/" || filelist[i];
str = Load Text File(file);
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
line = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
modifiedstr = Concat Items(data, "\!N");
dt = Open(
Char To Blob(modifiedstr),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Treat empty columns as numeric(0),
Compress Numeric Columns(0),
Compress Character Columns(0),
Compress Allow List Check(0),
Labels(1),
Column Names Start(1),
First Named Column(1),
Data Starts(2),
Lines To Read("All"),
Year Rule("20xx")
),
invisible
);
dt << Set Name(filelist[i]);
dt << New Column("Source", Character, Nominal, << Set Each Value((dt << get name)));
If(!Is Empty(dt_collector),
dt_collector << Concatenate(
dt,
Append to first table
);
Close(dt, no save);
,
dt_collector = dt;
);
);
未经测试,但大约是正确的。查找InsertInto() 和RemoveFrom();我目前没有打开 JMP。 这个想法是每次都删除(并捕获)前两行,在捕获并堆叠所有内容之后,将前两行放在前面,并附加额外的列名称。 在里面,为每一行添加文件名。
Re: 导入多个CSV文件,但有些标题格式错误需要通过JSL修改感谢您的支持,在这个jsl项目中确实学到了很多东西。