列を分割し、JSL を使用して分割に基づいて複数の複数を作成するこんにちは、
既存のテーブルを読み取って、目的の列を見つける必要があります [列名が「データ」であるとします]。
列「データ」は「ドット」で区切られた数値で、同じ長さです。
私の目標は、このテーブルを開き、列 "data" を読み取り、"ドット" を削除して、[値の長さに従って] 新しい列を作成し、各列に各値を保持することです。
元のテーブル:
データ
------
123.56.8.342
431.02.0.567
318.00.1.816
.....
期待される出力:
データ c1 c2 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 を使用して分割に基づいて複数の複数を作成するどちらの方法にも利点があります。 数式メソッドにより、新しい行の追加と日付値の変更が可能になり、c1....cn 列が自動的に調整されます。 各値を設定する利点は、静的な値を提供することです。数式を複数回実行する必要がないため、より効率的であることが証明されます。Re: 列を分割し、JSL を使用して分割に基づいて複数の複数を作成するありがとうジム。
あなたはエレガントなソリューションを持っています。
提案された方法に基づいて、列名が続いていないことに気付きました[ie. 「ドット」に遭遇するたびにCol #をスキップします];小さな列名のマッサージが必要です[私が世話をしました]。
質問:
Jamo がパフォーマンスの観点から提案したように、列に式を持たせて eval/substitute を使用するか、「各値を設定する」ことをお勧めしますか?
ありがとう、
デビッド
Re: 列を分割し、JSL を使用して分割に基づいて複数の複数を作成する欠けていたものを教えてくれて、Jamo に感謝します。 私は私が近くにいることを知っていました;)
組み込み関数「各値を設定する」について知りません。
うん、すべてうまくいく!
ありがとう、
デビッド
Re: 列を分割し、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 を使用して分割に基づいて複数の複数を作成する.jsl のバージョン 2 のみを確認しましたが、非常に近いものでした。
修正版を添付しました。
ループ部分を大幅に修正しました。 式で Eval(Parse()) を使用せずに管理する方法が最も可能性が高いですが、今回はこのソリューションを使用しました。 すべての行で同じ変数 clean_DATA のデータを使用していました。 また、数式が必要な場合は、 Eval(Parse()) (または式?) を使用して、データテーブルで数式を機能させ続ける必要があります。 数式が必要ない場合は、数式の代わりに << Set Each Value を使用します。
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 column
編集:
Eval Insert、Eval Expr、Parse、および Substitute を式で使用することに関する良い投稿https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998