안녕하세요,
2개의 테이블(Table1과 Table2)이 있는데, 둘 다 데이터베이스에서 쿼리를 받았습니다.
열을 일치시켜(:match) Table1의 열을 Table2로 업데이트해야 합니다.
문제는 다음과 같습니다.
- 데이터베이스의 정규식을 사용하여 Table1에 대한 :match 콘텐츠를 얻습니다. (때로는) "XXXX-YY-ZZZ" 형식을 사용합니다.
- 다른 데이터베이스에서 다르지만 일관된 형식인 “XXXXYYZZZ”를 사용하여 Table2에 대한 :match 콘텐츠를 얻습니다.
If()와 Subsitute()를 수동으로 사용하여 추가 단계에서 "-"를 제거할 수 있지만 열 형식이 일반적으로 일치하는 많은 수의 테이블 업데이트를 반복해야 합니다. 가능하다면 그 경로를 피하고 싶습니다.
가능한 해결책은 두 가지가 있다고 생각합니다.
1- Update() 내에서 특정 문자를 무시하여 열 간의 "가장 가까운 일치"를 찾을 수 있는 우아한 방법이 있습니까?
2- “XXXX-YY-ZZZ”와 같은 정규 표현식으로 특정 문자 체인을 매치하고 “XXXXYYZZZ”만 출력하는 방법이 있나요? 그러면 table1에서 :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()를 사용할 수 있다면 그렇게 하세요. JMP의 업데이트/조인에는 조인을 위한 "가장 가까운" 옵션이 없습니다(그리고 이는 "가장 가까운 것은 무엇인가"라는 질문이 있는 문자열을 기반으로 하기 때문에 더 어렵습니다). 새 열을 만들고 싶지 않다면 Transform Columns를 사용할 수도 있습니다(이 작업을 하려면 처음에는 약간 더 많은 노력이 필요할 수 있음)
// 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()를 수행합니다. 첫 번째는 일치하는 패턴을 찾고 두 번째는 변환을 적용("-" 제거)합니다.
그렇게 우아하지는 않지만 작동하며 충분히 견고합니다.
항상 그렇듯이 다시 한번 감사드립니다:)
- 설교자
- 설교자