こんにちは、
2 つのテーブル (Table1 と Table2) があり、どちらもデータベースからクエリされます。
列を一致させて (:match)、Table1 を Table2 で更新する必要があります。
問題は次の通りです:
- データベースから、(場合によっては) 次の形式の正規表現を使用して、Table1 の :match コンテンツを取得します: “XXXX-YY-ZZZ”。
- 別のデータベースから、異なるが一貫した形式「XXXXYYZZZ」で Table2 の :match コンテンツを取得します。
手動で If() と Subsitute() を使用して追加の手順で「-」を取り除くことはできますが、通常は列の形式が一致する多数のテーブル更新をループする必要があります。可能であれば、その方法は避けたいと思います。
考えられる解決策は 2 つあります。
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() を使用できる場合は、それを使用してください。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 で非同一文字列に基づいて 2 つのテーブルを結合する必要がある (正規表現を使用しますか?) (投稿) では、本当にそのルートを実行したい場合、最も近い文字列の一致によって結合する方法のアイデアがいくつか得られます。
こんにちは、ジムさん
私の制約は、すべてのケースでこの変換が必要なわけではないので、スクリプトをもっとスマートにしたかったのです。しかし、解決策を見つけました。
IF() CONTAINS() を使用して「-」を検索し、それが true の場合は、2 つの REGEX() を実行します。最初の REGEX() は一致するパターンを検索し、2 番目の REGEX() は変換を適用します (「-」を削除します)。
非常にエレガントではありませんが、機能し、十分に堅牢です。
いつもありがとうございます:)
- 説教者
- 説教者