你好,
我有 2 个表(表 1 和表 2),均从数据库中查询。
我需要通过匹配列(:match)用表2 来更新表1。
问题是:
- 我使用正则表达式从数据库中获取 Table1 的匹配内容,有时格式为:“XXXX-YY-ZZZ”。
- 我从另一个数据库获取 Table2 的匹配内容,其格式不同但一致:“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"))
)嗨吉姆,
如果我按照脚本中所述添加使用 substitute() 删除“-”的步骤,那么就可以了。
如果我用我的真实数据来做这件事,它也能起作用,但我想避免这个步骤,因为并不是所有的 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() 查找“-”,如果为真,则执行双重 REGEX():第一个查找要匹配的模式,第二个应用转换(删除“-”)。
它不是超级优雅但它有效并且足够强大。
一如既往地再次感谢:)
- 传教士
- 传教士