你好,
我有 2 個表(表 1 和表 2),都是從資料庫查詢的。
我需要透過比對列(:match)來用Table2更新Table1。
問題是:
- 我從資料庫中使用正規表示式得到 :match 內容,格式為(有時):「XXXX-YY-ZZZ」。
- 我從另一個資料庫取得了 Table2 的 :match 內容,格式不同但一致:「XXXXYYZZZ」。
我可以手動使用 If() 和 Subsitute() 在額外的步驟中刪除“-”,但我需要循環大量表更新,並且列格式通常匹配。如果可能的話,我想避開那條路。
我看到兩種可能的解決方案:
1- Update() 中是否有一種優雅的方法可以透過忽略特定字元來尋找列之間的「最接近的匹配」?
2-有沒有辦法將特定的字元鏈與正則表達式匹配,例如“XXXX-YY-ZZZ”,但僅輸出“XXXXYYZZZ”? 這樣我就可以修復表1中的上游:match的格式
如果您有其他方法,我很想聽聽。
下面是帶有「額外」步驟的範例腳本
謝謝,
- 傳教士
Names Default To Here( 1 );
dt1 = New Table( "Table1",
Add Rows( 20 ),
New Column( "match", // format "XXX-YY-ZZZ"
Character,
"Nominal",
set values({"786-79-6822", "413-31-2411", "286-37-3500", "985-96-1683", "641-67-8572","537-38-5509", "136-71-5147", "965-59-8232", "141-62-8885", "212-98-2829","330-28-2219", "938-39-3349", "203-47-1149", "310-16-8252", "273-85-3049","543-87-1778", "784-24-3481", "708-81-6285", "902-33-5331", "763-59-8837"})
),
New Column( "Value1",
Character,
"Nominal",
set values ( {"1.7826391133", "3.4239116441", "0.1994181285", "3.5850992007", "1.8049403103", "2.3814269388", "2.3045256995", "3.3546657711", "2.341782487", "1.9017582694", "1.5864833118", "1.3739423649", "2.0963420644", "0.4244481763", "3.6469046306", "3.1553423936", "0.6822735481", "3.9464927437", "0.7582216617", "0.9802403664"})
)
);
dt2 = New Table( "Table2",
Add Rows( 20 ),
New Column( "match", // format "XXXYYZZZ"
Character,
"Nominal",
set values({"537385509", "708816285", "938393349", "543871778", "286373500", "902335331", "784243481", "273853049", "641678572", "203471149", "985961683", "413312411", "786796822", "965598232", "136715147", "763598837", "330282219", "212982829", "141628885", "310168252"}
)
),
New Column( "Value2",
Character,
"Nominal",
set values ( {"1.7489787", "1.763834", "3.0609319", "0.7657611", "2.0515768", "0.8648471", "1.0966909", "1.5494098", "2.7582114", "1.1778722", "2.8651535", "2.3157859", "4.3617672", "0.7137677", "1.1055379", "1.8654949", "4.0616821", "2.3122891", "1.9496742", "2.3774745"})
)
);
// I would like to remove this extra step (it doens't apply on all tables I need to loop through...
dt1 << new column ("Column 3",Character,"Nominal",formula(substitute(:match,"-","")));
// ...and make the Update() more robust with a "nearest match", not "exact "match"
dt1 << Update (
with (dt2),
match columns (Column("Column 3") == Column("match"))
)嗨吉姆,
如果我按照我的腳本中的描述添加使用 Replace() 刪除“-”的步驟,那麼就可以了。
如果我使用真實資料執行此操作,它也可以工作,但我想避免此步驟,因為並非所有 Table1 在 :match 列中都有額外的“-”
如果你可以使用 Substitute() 就可以做到這一點。 JMP 的更新/連接沒有用於連接的「最近」選項(而且這更困難,因為您是基於問題是「最近的是什麼」的字串來執行此操作)。如果您不想建立新的列,您也可以使用轉換列(開始時需要付出更多的努力)
// Update data table
Data Table("Big Class") << Update(
With(Data Table("Untitled")),
Match Columns(
Transform Column("Concatenate[name]", Character, Formula(Concat(:name))) =
:Column 1
)
);
使用 JSL 在 Recode 平台中編寫「分組相似值」函數腳本,並且需要在 JSL(您的帖子)中根據不同的字串連接兩個表(使用正則表達式? )可以提供一些如何透過最接近的字元串連匹配進行連接的想法,如果您真的很想走那條路。
嗨吉姆,
我的限制是並非所有情況都需要這種轉換,因此我希望我的腳本更加聰明。但我找到了解決方案:
我用 IF() CONTAINS() 查找“-”,如果它是 true,我正在執行雙重 REGEX():第一個用於查找要匹配的模式,第二個用於應用轉換(消除”-”) 。
它不是超級優雅,但它可以工作並且足夠強大。
再次感謝,一如既往:)
- 傳教士
- 傳教士