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;"><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></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計畫中確實學到了很多東西。