搜尋一列中的每個單元格以查找特定內容大家好,
我有一個 jmp 資料表,其中有一列每行包含不同的字串。我想知道是否可以循環該列以查找該單元格中字串的特定部分。
這是字串的範例:
班級:10 表:15 統計:NA 位置:NA 教師:Sam --> 儲存格內容
班級:11 桌子:11 統計:NA 地點:NA 老師:Sam
挑戰是我有不同的班級#和不同的表#。但是,我只需要找到以“Class:#”開頭的單元格,並將其餘單元格放入列表中。
所以我的問題是:我可以在該特定列進行部分單元格搜尋嗎?
自動化和腳本編寫基礎資料分析與建模回覆:搜尋一列中的每個儲存格以查找特定內容這是處理這個問題的一種可能的方法
Names Default To Here( 1 );
dt = Current Data Table();
foundList = {};
For Each Row(
If(
Word( 1, thestringcolumn, " " ) & Is Missing(
Num( word * 2, thestringcolumn, " " )
) == 0,
Insert Into(
foundList,
Substr(
thestringcolumn,
Length( Word( 1, thestringcolumn, " " ) )
+Length( Word( 2, thestringcolumn, " " ) ) + 2
)
)
)
);回覆:搜尋一列中的每個儲存格以查找特定內容根據您的字串格式,您可以使用重新編碼(請注意,未選取「如果沒有符合則保留文字」)

或使用 For Each Row 的腳本。如果您使用 For Each Row,您有許多不同的選項來解析字串以及如何儲存結果,以下是另一個範例
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"Class: 10 Table:15 Stat:NA loc:NA teacher:Sam",
"Class: 11 Table:11 Stat:NA loc:NA teacher:Sam"}
)
)
);
result = {};
For Each Row(dt,
res = Regex(:Column 1, "^(Class: \d+) (.*)?", "\2");
If(!IsMissing(res),
Insert Into(result, res);
);
);
show(result);
// result = {"Table:15 Stat:NA loc:NA teacher:Sam", "Table:11 Stat:NA loc:NA teacher:Sam"};回覆:搜尋一列中的每個儲存格以查找特定內容謝謝@jthi 。這非常適合我上面提供的範例。
我確實有一個後續問題,假設我們有以下字串列表,
10::等級:A
11::等級:A1
12::等級:A2
..
20::B級
21::B1級
22::B1級
30::C級
31::C1類
32::C2 類
假設我想為每個班級列出一個清單。我希望第一個是 ClassAList = (11::Class: A ,11::Class: A ,11::Class: A );
我嘗試修改 regex() 以查找字串中的前導數字,然後將其移至相應的列表中。我使用了這樣的東西: Regex("10:::Class" , "[1]")
這裡的問題是它正在尋找所有字串中的 [1]。是否可以選擇正規表示式應在其中尋找匹配項的索引?
這裡的另一個問題是只回傳 1,而不是整個字串。
任何指導表示讚賞。
回覆:搜尋一列中的每個儲存格以查找特定內容這可能會讓你知道你可以做什麼
Names Default To Here(1);
mylist = {"10::Class: A", "11::Class: A1", "12::Class: A2", "20::Class B", "21::Class B1",
"22::Class B1", "30::Class C", "31::Class C1", "32::Class C2"};
class_pattern = "\d+::(Class:? [A-Z])";
aa = Associative Array();
For Each({myitem}, mylist,
res = Regex(myitem, class_pattern, "\1");
If(!Contains(aa, res),
aa[res] = {};
);
Insert Into(aa[res], myitem);
);
show(aa);
https://regex101.com/r/itqqww/1用來解釋正規表示式模式
回覆:搜尋一列中的每個儲存格以查找特定內容謝謝@jthi 。這非常有效。
跟進問題:
我想僅根據第一個數字將列表分組為子組。我嘗試使用正規表示式錨來執行此操作。但是,它不是只匹配第一個數字,而是匹配第一個數字和後面的任何數字。任何指導表示讚賞。
回覆:搜尋一列中的每個儲存格以查找特定內容你指的是B1級部分嗎?您可以透過新增 \d? 來修改正規表示式?放在括號內( https://regex101.com/r/Yfh6pZ/1 )。 \d 將符合數字,而 ?將匹配先前的標記零次或一次。如果您不想捕獲沒有數字的組,請忽略 ?或將其替換為 {1}

[
"Class B" => {"20::Class B"},
"Class B1" => {"21::Class B1", "22::Class B1"},
"Class C" => {"30::Class C"},
"Class C1" => {"31::Class C1"},
"Class C2" => {"32::Class C2"},
"Class: A" => {"10::Class: A"},
"Class: A1" => {"11::Class: A1"},
"Class: A2" => {"12::Class: A2"}
]