如何優雅地執行更新,但對於單行?您好 - 我正在嘗試從一個表中取出一行,並將其放入另一個表中使用者在輸入框中指定的行中。 但是,更新函數似乎無法指定行,因此我需要花一個小時為兩個資料表鍵入 105 列中的每一列,如下所示:
dt:{"ColA"}[rownumber] = dt1:{"ColA"}[1];<BR />dt:{"ColB"}[rownumber] = dt1:{"ColB"}[1];<BR />.<BR />.<BR />.<BR />dt:{"ColDA"}[rownumber] = dt1:{"ColDA"}[1];這很好,但我可以想像我的編碼朋友在座位上蠕動。 有沒有更優雅的方法來做到這一點? 我見過有人引用關聯數組,但我在使用它們時遇到了問題。
我認為上面的程式碼就足夠了,但如果重要的話,這裡是原始程式碼,相關行用紅色繪製:
w = New Window( "Choose Row Number for XRD Run input", // opens a window with a title and this content...
Border Box( top( 20 ), bottom( 20 ), Left( 20 ), Right( 20 ), // window dressing
V List Box( // V and H lists nest to organize the display boxes
H Center Box( Text Box( "Choose Row Number for XRD Run input" ) ), // a second title, centered
Spacer Box( size( 1, 30 ) ), // a little vertical space
H Center Box( rowtemp=Number Edit Box( ) ), // data entry
Spacer Box( size( 1, 10 ) ), // a little vertical space
H Center Box( // center the button
Button Box( "Import Data", // this script runs when the button is pressed...
rownumber = rowtemp << Get;
// Run XML Import
Include( "jmpprj://contents/Import XRD XML.jsl");
// Reference Data Tables
dt = Data Table( "Experimental Info" );
dt1 = Data Table( "XMLTempTable" );
// Move to Experimental info table
<FONT color="#FF0000">dt:{"xsi:Schema Location 1"}[rownumber] = dt1:{"xsi:Schema Location 1"}[1];</FONT>
// Close XMLTempTable
close(dt1);
// optionally, close the dialog. Or, you might want to run it again...
w << closeWindow; // just the dialog, not the report
)
)
)
)
);自動化和腳本編寫視窗回覆:如何優雅地執行更新,但對於單行?這是進行單行更新的一種方法。它從一個資料表中取得指定行,並將其更新到另一個資料表中的指定行。
names default to here(1);
dt=
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// Create a random data table with 5 rows
// Subset data table
// → Data Table( "Subset of Big Class" )
dt2 = dt << Subset( Sample Size( 5 ), Selected columns only( 0 ), output table("Selection") );
// Give new names to the subsetted table
dt2:name[1] = "PAT";
dt2:name[2] = "BRIT";
dt2:name[3] = "TERRY";
dt2:name[4] = "KRIS";
dt2:name[5] = "JEN";
wait(10);
// Below is the code that does the 1 row update
// Row in data table Big Class to be updated
outRow = 12;
// Row in data table Selection to get data from
inRow = 4;
// The Update process
// Create a row column in data table Big Class
dt << new column( "Row", formula(row()));
// Subset the inRow to a new table
dt2 << select where(row()== inRow);
dtTemp = dt2 << subset(selected rows(1), selected columns(0), invisible);
// Clear selected row in data table Selection
dt2 << clear select;
// Create a new column in the temp data table
dtTemp << new column("Row", set each value(outRow));
// Update data table Big Class
dt << Update(
With( dtTemp ),
Match Columns( :Row = :Row )
);
// Delete the temp data table
close( dtTemp, nosave );
// Delete the Row Column
dt << delete columns( :Row );
回覆:如何優雅地執行更新,但對於單行?如果兩個表中都有唯一標識符,例如姓名和年齡,則可以將它們用作匹配條件。
此外,您還可以使用虛擬變換列行選擇提供額外的符合條件來選擇要更新的行:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
New Namespace(
"selection"
);
selection:ChangeRows = [5, 2, 7];
updateTable = dt << Subset( All rows, Selected columns only( 0 ) );
:weight << set each value( 1000 );
dt << Update(
With( updateTable ),
Match Columns(
:name = :name,
:age = :age,
transform column( "row selection", Formula( If( N Items( Loc( selection:ChangeRows, Row() ) ), 1, . ) ) ) =
transform column( "row selection", Formula( 1 ) )
),
Add Columns from Update Table( None ),
Replace Columns in Main Table( :weight )
);