JSLを使用して、列を分割し、分割に基づいて複数の倍数を作成しますこんにちは、
既存のテーブルを読み取って、目的の列を見つける必要があります[列名が「データ」であると言います]。
列「data」は「ドット」で区切られた数値であり、同じ長さです。
私の目標は、このテーブルを開き、列「data」を読み取り、「dot」を削除して、[値の長さに従って]新しい列を作成することです。各列は各値を保持します。
元のテーブル:
データ
------
123.56.8.342
431.02.0.567
318.00.1.816
....。
期待される出力:
データc1c2 c3 c4 c5 c6 c7 c8 c9
-------------------------------------------------- ----------------------------
123.56.8.342 1 2 3 5 6 8 3 4 2
431.02.0.567 4 3 1 0 2 0 5 6 7
318.00.1.816 3 1 8 0 0 1 8 1 6
私の最初の試み[trial1.jmp]では、2つのforループ[列を作成するための内部ループと、行数のための他のループ]があり、より多くの列を作成しています[つまり、読み取られるデータの幅*行数] 。
2回目の試行[trail2.jmp]で、正しい列数を取得していますが、値は静的です。
添付されているのは私のjslです。
これに真夜中の油を燃やして、助けに感謝します:(
ありがとう、
デビッド
データ表Re:列を分割し、JSLを使用した分割に基づいて複数の倍数を作成します.jslのバージョン2のみをチェックしましたが、非常に近かったです。
修正版を添付しました。
ループ部分をほとんど変更しました。 式を使用してEval(Parse())なしで管理する方法が最もありそうですが、今回はこのソリューションを使用しました。 すべての行で同じままである変数clean_DATAからのデータを使用していました。 また、数式が必要な場合は、Eval(Parse())(または式?)を使用して、数式をデータテーブルで機能させ続ける必要があります。 数式が必要ない場合は、数式の代わりに<<各値を設定します。
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
Eval(Parse("dt << New Column(\!"c\!" || Char(i),Numeric, Continous,
Formula(Num(Substr(Regex(:data, \!"\D\!", \!"\!", GLOBALREPLACE ), "||char(i)||", 1 )));
)));")); // put 1 bit in each column
);<< Set Each Valueを使用すると、forループは次のようになります。
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
dt << New Column("c" || Char(i),Numeric, Continous,
<< Set Each Value(Num(Substr(Regex(:data, "\D", "", GLOBALREPLACE ), i, 1 )));
)
); // put 1 bit in each columnRe:列を分割し、JSLを使用した分割に基づいて複数の倍数を作成しますこれが私があなたの要求を達成する方法です。Substitute()関数を使用すると、変数「i」への参照ではなく、変数「i」の実際の値を数式に含めることができます。
Names Default To Here( 1 );
dt = Current Data Table();
col = Column( dt, "DATA" );
colLength = Length( col[1] );
For( i = 1, i <= colLength, i++,
If( Substr( col[1], i, 1 ) != ".",
Eval(
Substitute(
Expr(
dt << New Column( "c" || Char( i ), Numeric, Continous, Formula( Num( Substr( :data, __i__, 1 ) ) ) )
),
Expr( __i__ ), i,
)
)
)
);Re:列を分割し、JSLを使用した分割に基づいて複数の倍数を作成します何が欠けているのか教えてくれたJamoに感謝します。 私は近くにいることを知っていました;)
dintは、組み込み関数「各値の設定」について知っています。
うん、すべてがうまくいく!
ありがとう、
デビッド
Re:列を分割し、JSLを使用した分割に基づいて複数の倍数を作成しますジムに感謝します。
あなたはエレガントな解決策を持っています。
あなたの提案した方法に基づいて、私は列名が継続していないことに気づきました、[すなわち。 「ドット」が検出されると、列番号をスキップします];小さな列名のマッサージが必要です[私が気をつけました]。
質問:
パフォーマンスの観点からJamoが提案したように、列に式を設定してeval / replaceを使用することを提案しますか、それとも「各値を設定する」ことを提案しますか?
ありがとう、
デビッド