jmp ファイル内の列名を、別の .csv ファイル内の行の値に従って名前変更します。こんにちは、
私は JSL の初心者なので、助けていただきありがとうございます。
3つのファイルがあります。
ファイル #1: これは、以下の 3 つの列を含む参照ファイル [as 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:
カテゴリ|データ|多くの列....
--------------------------------------
123.23…。
321.45……
……
たくさんの行
列「data」の値の幅(ドットを除く)は、指定されたカテゴリのファイル #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] の名前を、参照ファイルの列 "label" で定義されているように 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 については、参照ファイルを開いたものの、次に進むかどうかわかりません。
ありがとう
デビッド
データアクセスマスカスタマイゼーションRe: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するOK....これは少しうるさい....しかし、dataTablesList に含まれるのはデータ テーブル名のリストではなく、データ テーブルを指す data table() 関数です。
{"Table1","Table2"} // データテーブル名のリスト
{ data table( "Table1" ), data table( "Table2" ) } // データテーブルへのポインタのリストRe: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するうん。とった。データテーブルの名前を保持します
-デビッド
Re: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するdataTableList はデータ テーブルを保持せず、テーブルへのポインタのみを保持します。 リストを作成して実行する
Show( dataTableList );
リストに何が含まれているかが表示されます。
また、変数の上にマウスを置くだけでリストの内容を確認でき、その値が表示されます。
Re: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するありがとうジム。 [私のニーズに合わせて] 小さな変更を加えるだけで、うまくいきます。 ありがとう !!
質問ですが、リスト [datatableList] には多くの情報を保持できますか?
私の各テーブルには数千のような多くの行があり、多くの列もあります。
-デビッド
Re: 別の .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>Re: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するジム、
ステップ 2 に以下の変更を加えた場合 [以下に示す]
++++
これは私のref.csvです:
カテゴリ|幅|ラベル
ABC 0 ラベル0.0
ABC1ラベル0.1
ABC2ラベル0.2
ABC3ラベル0.3
ABC4ラベル0.4
ABC5ラベル0.5
ABC6ラベル0.6
ABC 7 ラベル0.7
ABC8ラベル0.8
ABC9ラベル0.9
ABC 10 ラベル0.10
ABC 11 ラベル0.11
ABC 12 ラベル0.12
ABC 13 ラベル0.13
ABC 14 ラベル0.14
ABC 15 ラベル1.15
ABC 16 ラベル0.16
ABC 17 ラベル0.17
ABC 18 ラベル0.18
ABC 19 ラベル0.19
ABC 20 ラベル0.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(カテゴリリスト);
+++
ログに次のようなメッセージが表示されます。
カテゴリリスト = {"ラベル0.0"、"ラベル0.1"、"ラベル0.2"、"ラベル0.3"、"ラベル0.4"、"ラベル0.5"、"ラベル0.6"、"ラベル0.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], "." ) );
);
);
ありがとう、
デビッド
Re: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するあなたが提供したコードを見ました。 若干の混乱があるようです。
これが私がそれを傍受し、間違っていると訂正する方法です。
dtcat は、列名 [カテゴリ、幅、ラベル]。
列名 [カテゴリ|データ|多くの列....] を持つ同じ構造を持つ複数のデータ テーブル dt1、dt2 などが存在します。
コードを実行しても何も起こりません
dtcat テーブルには data という名前の列がありません。デバッグを調べました。
dt1 テーブルはデータ列であるため、それを意味している可能性があります。
いろいろ試してみましたが、役に立ちませんでした。
表の定義に沿って調整していると思います。元の投稿で説明したものを使用してください。私の意見では役立つかもしれません。
ここでもまた助けに感謝します。
ステップ 2 の推奨事項を教えてください
ありがとう
デビッド
Re: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更する- 私の最後のコードが機能しないということですが、なぜ機能しないのでしょうか?
- あなたが求めているリストを作成する方法は次のとおりです
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
Re: 別の .csv ファイルの行の値に従って jmp ファイルの列名の名前を変更するありがとうジム。機能していません。
したがって、目標 #2 では、ロジック全体を値のステップに分割しました。
ステップ 1: データ テーブルからカテゴリ名を取得し [たとえば dt1]、それを変数に格納します [たとえば、カテゴリ A を保持しているとします] - 完了
ステップ 2: ステップ 1 から変数を読み取り、カテゴリ = A に一致するすべての行を検索します。 ref.csv の「Label」列からラベル名を取得し、[dtCat として呼び出しました]、それをリストまたは変数に保存します。 [ category_list という名前だとします]
したがって、議論で述べた例から使用します。 category_list が以下の値を保持することを期待しています。
カテゴリリスト = L1.abc、 L2.xt、 L8.dr、 L20.ws、 L72オンス
やり方が分かりません。 よろしくお願いします。
ステップ 3: リスト内のカウントを確認します == いいえ。 dt1 で作成された新しい列の数。これは堅牢性を高めるために私が特別に行っていることです。
category_list の要素数は 5 です
dt1 で作成された新しい列は 5 です。 [必要な新しい列の数を見つけるための変数を保持しているため、これは目標 1 から取得しました]。
ステップ 4: i = 5 のループを使用して、 dt1 の列名、つまり c[i] をリスト [i] に置き換えます。
c1 が交換されました
私は現在ステップ 2 にいて、助けが必要です。
ありがとう、
デビッド
Re: 別の .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 );
);