別の.csvファイルの行の値に従って、jmpファイルの列名の名前を変更しますこんにちは、
私はJSLの初心者なので、助けてくれてありがとう。
私は3つのファイルを持っています。
ファイル#1:以下のように3列を保持する[ref.csvとして]参照ファイルです。
カテゴリ、幅、ラベル
--------------------------------
A、0、L1.abc
A、1、L2.xt
A、2、L8.dr
A、3、L20.ws
A、4、L72.oz
B、0、L11.qq
...。
B、6、L61.er
ファイル#2:JMPのデータファイル#1、カテゴリ、データ、その他多くの列を保持します。
ファイル#3:JMPのデータファイル#2、カテゴリ、データ、その他多くの列を保持します。
2つのデータファイル[ファイル#2とファイル#3]の違いは、データ列のカテゴリタイプと値の幅です。
データファイル#1:
カテゴリ|データ|多くの列.....
----------------------------------------
A 123.23...。
A 321.45...。
....。
多くの行
列「データ」(ドットを除く)の値の幅は、特定のカテゴリのファイル#1の行数と一致しています。
例:
データファイル#1の行1の123.23の幅は5です。
カテゴリAの参照ファイルの行数は5になります。これは、言うまでもなくテストする必要はありません。これがテーブルの入り方です[つまり、ソースからプルされたとき]
将来的には、参照ファイル、たとえばカテゴリAの場合、行数が6以上に増加し、ファイルデータファイル#1のデータ列に保持される値の幅もデータベースから情報を取得するときに増加します。
データファイル#2:
カテゴリ|データ|多くの列.....
----------------------------------------
B 1236.23...。
B 3213.45...。
....。
多くの行
目標1:データファイル#1 [およびその他のデータファイル]の「データ」列に保持されている値の幅に応じて新しい列を作成する
私は目標#1で終わりました!
例:
更新されたデータファイル#1は次のようになります。
カテゴリ|データ| c1 | c2 | c3 | c4 | c5 |多くの列.....
----------------------------------------
A 123.23 1 2 3 2 3...。
A 321.45 3 2 1 4 5...。
....。
目標2:参照ファイルの「ラベル」列で定義されているように、データファイル#1の新しい列の名前を[つまり、c1からc5]からL1 ...からL72 ...に変更します。セルの値は変更されません。選択した列名を更新するだけです。
目標2が完了した後の期待される出力:
データファイル#1を次のように更新します。
カテゴリ|データ| L1.abc | L2.xt | L8.dr | L20.ws | L72.oz |多くの列.....
----------------------------------------
A 123.23 1 2 3 2 3...。
A 321.45 3 2 1 4 5...。
....。
目標2についてサポートが必要です。
目標#2では、参照ファイルを開きましたが、先に進むかどうかはわかりません。
ありがとう
デビッド
データ表再:別の.csvファイルの行の値に従ってjmpファイルの列名の名前を変更しますこれはテストされていないスクリプトです。これは、2番目の目標を達成できるようになるのにかなり近いはずです。
dtCat = Data Table( "file#1 name" );
dt1 = Data Table( "file#2 name" );
dt2 = Data Table( " file#3 name" );
// add dt3, dt4 etc. for each of the categories you have
// Find the number of data tables to process....A B C......
// Create a temporary new column in data table dtCat that has just the category
dtCat << New Column( "temp", character, formula( Word( 1, :data, "." ) ) );
// Summarize the data getting one element in the ByGroup list for each Category found
Summarize( dt, Categories = ByGroup( :temp ) );
numCategories = N Items( Categories );
For( i = 1, i <= numCategories, i++,
// Subset the dtCat table into the a new data table with just the one
// category being processed
dtCat << select where( :temp == Categories[i] );
dtSub = dtCat << subset( selected rows == 1, selected columns( 0 ) );
// set the offset of where to start the renaming
offset = 3;
// Loop
// Change names in dt1 to match the Label in
For( k = 1, k <= N Rows( dtSub ), k++,
Eval(
Substitute(
Expr(
Column( __dt__, k + offset ) << set name( Word( 3, dtSub:Data[k], "." ) ),
Expr( __dt__ ),
Parse( "dt" || Char( i ) )
)
)
)
);
Close( dtSub, nosave );
);再:別の.csvファイルの行の値に従ってjmpファイルの列名の名前を変更しますジムに感謝します。動作していません。
したがって、目標#2では、ロジック全体を値のステップに分解しました。
ステップ1:データテーブルからカテゴリ名を取得し[たとえばdt1]、それを変数に格納します[たとえばAのカテゴリを保持している]-完了
step2:step1から変数を読み取り、category = Aに一致するすべての行を見つけます] ref.csvの「Label」列からラベル名を取得し[dtCatと呼びます]、リストまたは変数に格納します。 [category_listと呼ばれると言う]
したがって、説明で述べた例から使用します。 category_listが以下の値を保持することを期待しています。
category_list = L1.abc、 L2.xt、 L8.dr、 L20.ws、 L72.oz
私はこれを行う方法がわかりません。 助けに感謝します。
ステップ3:リストのカウントを確認します==いいえ。 dt1で作成された新しい列の数。これは私が堅牢性のために行っている余分なことです。
category_listのカウントは5要素です
dt1で作成された新しい列は5です。 [必要な新しい列の数を見つけるための変数を保持しているため、これは目標1から取得しました]。
ステップ4:dt1の列名、つまりc [i]をlist [i]に置き換えるループを使用します(i = 5)
c1を交換
私は今ステップ2にいて、助けが必要です。
ありがとう、
デビッド
再:別の.csvファイルの行の値に従ってjmpファイルの列名の名前を変更します- あなたは私の最後のコードが機能していないことを示しています.....なぜですか?
- これがあなたが求めているリストを作成する方法です
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
再:別の.csvファイルの行の値に従ってjmpファイルの列名の名前を変更します私はあなたが提供したコードを見ました。 混乱があるようです。
これは私が私を傍受して修正する方法ですそれは間違っています。
dtcatは、列名が[カテゴリ、幅、ラベル]。
同じ構造で列名が[Category | data | many cols .....]の複数のデータテーブルdt1、dt2などがあります。
コードを実行しても何も起こりません
dtcatテーブルにdataという名前の列がなく、デバッグを調べました。
データ列であるため、dt1テーブルを意味している可能性があります。
私は遊んでみましたが、それは役に立ちませんでした。
私たちは表の定義に沿っていると思います。元の投稿で説明したものを使用してください。私の意見に役立つかもしれません。
ここでも助けに感謝します。
ステップ2の推奨事項を教えてください
ありがとう
デビッド
再:別の.csvファイルの行の値に従ってjmpファイルの列名の名前を変更しますジム、
以下の変更を加えたステップ2の場合[以下に表示]
++++
これは私のref.csvです:
カテゴリ|幅|ラベル
ABC 0 label0.0
ABC 1 label0.1
ABC 2 label0.2
ABC 3 label0.3
ABC 4 label0.4
ABC 5 label0.5
ABC 6 label0.6
ABC 7 label0.7
ABC8ラベル0.8
ABC9ラベル0.9
ABC 10 label0.10
ABC11ラベル0.11
ABC 12 label0.12
ABC 13 label0.13
ABC 14 label0.14
ABC15ラベル1.15
ABC 16 label0.16
ABC 17 label0.17
ABC 18 label0.18
ABC 19 label0.19
ABC 20 label0.20
B0ラベル11.22
C1ラベル11.21
D2ラベル11.23
E0ラベル11.24
私のコード:
dt_ref =オープン( "ref.csv");
For(i = 1、i <= N Rows(dt_ref)、i ++、
insert into(Category_List、word(1、:label [i]、 "。") || 「。」 || word(2、:label [i]、 "。"));
);
show(Category_List);
+++
ログに次の情報が表示されます。
Category_List = {"label0.0"、 "label0.1"、 "label0.2"、 "label0.3"、 "label0.4"、 "label0.5"、 "label0.6"、 "label0.7" 、 "label0.8"、 "label0.9"、 "label0.10"、 "label0.11"、 "label0.12"、 "label0.13"、 "label0.14"、 "label1.15"、 " label0.16 "、" label0.17 "、" label0.18 "、" label0.19 "、" label0.20 "、" label11.22 "、" label11.21 "、" label11.23 "、" label11。 24 "、"。 "、"。 "};
カテゴリがABCの場合にのみラベルを選択したい。それ、どうやったら出来るの?
次のことを試しましたが、Category_Listに対して何も返されません。
prod_found = {"ABC"};
if(:product == prod_found、
For(i = 1、i <= N Rows(dt_ref)、i ++、
insert into(Category_List、word(1、:name [i]、 "。") || 「。」 || word(2、:name [i]、 "。"));
);
);
ありがとう、
デビッド
再:別の.csvファイルの行の値に従ってjmpファイルの列名の名前を変更します私の誤報でごめんなさい。カテゴリデータテーブルの構造を読み間違えました。以下は、いくつかのデータテーブルとカテゴリテーブルを作成し、データテーブルを展開して、最後にカテゴリデータテーブルのエントリに基づいて列の名前を変更するスクリプトです。これで私たちが軌道に戻ることを願っています。スクリプトは、必要な数のデータテーブルで機能します。実行する必要があるのは、処理するすべてのデータテーブルをdataTableListリストに追加することだけです。
Names Default To Here( 1 );
// This example script opens up 2 data tables and 1 category table.
// In reality, as many as necessary data tables could be used
// Create the tables
dt1 = New Table( "Table1",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"ABC", "ABC", "ABC"} ) ),
New Column( "DATA", Character( 33 ), "Nominal", Set Values( {"123.56.8.342", "431.02.0.567", "318.00.1.816"} ), Set Display Width( 182 ) )
);
dt2 = New Table( "Table2",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"B", "B", "B"} ) ),
New Column( "Data", Character, "Nominal", Set Values( {"13.24", "98.44", "63.89"} ) )
);
dtCat = New Table( "The Categories",
Add Rows( 13 ),
New Column( "Category",
Character,
"Nominal",
Set Values( {"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "B", "B", "B", "B"} ),
Set Display Width( 67 )
),
New Column( "Width", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3] ) ),
New Column( "Label",
Character( 16 ),
"Nominal",
Set Values(
{"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7", "label0.8", "thelabel.1", "thelabel.2",
"thelabel.3", "thelabel.4"}
),
Set Display Width( 99 )
)
);
// Below this line, is the script that will add the new columns to each of the data tables
// and will take the names from the dtCat (Categories) data table and change the names to
// the columns in each of the data tables
// Create a list of the pointers to the data tables. This will allow for the using of the list
// entries to point to the data tables using a subscript
dataTableList = {};
insert into(dataTableList, dt1 );
insert into(dataTableList, dt2 );
// Loop across the data table list and expand the columns based upon the the column called Data
For( i = 1, i <= N Items( dataTableList ), i++,
ncols_to_add = length( substitute((dataTableList[i]:Data)[1],".",""));
For( k = 1, k <= ncols_to_add, k++, // the || operator joins two strings
dataTableList[i] << New Column( "c" || Char( i ),
Numeric,
Continous,
<<SET each="" value=""></SET>