JSL:如何循環遍歷列、生成圖形生成器報告並將每個報告保存為 JPG 文件我正在嘗試創建一個腳本,該腳本可以循環遍歷每列的每個單元格,以計算小於或大於指定值的單元格數量。
如果我有一個包含 A ~ D 列和 1 ~ 10 行的表格,我想按行和列計算單元格的值。 換句話說,對於A列的所有行,有多少行符合我的標準。 同樣,對於第 1 行的所有列,有多少列符合我的標準。 然後我會對所有行和列執行此操作。
這是我嘗試開始的,但它什麼也沒返回。 對此有什麼想法或更有效的方法嗎?
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = {};
//Column loop
For( i = 1, N Items( Numeric Columns ) <= 1, i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i]) < 101,
Count = Count++;
Show( Count );
)
)
);
回复:JSL:如何循環遍歷列、生成圖形生成器報告並將每個報告保存為 JPG 文件您還可以用一行替換“對於每行”部分來計算每列的行數。這將利用數據表函數,而不需要查看每列的每一行。
COUNT_VAL=NROWS((DT<<SELECT where=""></SELECT>
回复:JSL:如何循環遍歷列、生成圖形生成器報告並將每個報告保存為 JPG 文件該腳本存在一些很容易修復的問題。
1. for循環的測試部分是錯誤的:
<SPAN class="token function">N Items</SPAN><SPAN class="token punctuation">(</SPAN> Numeric Columns <SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><=</SPAN> <SPAN class="token number">1</SPAN>
數字列的數量不會改變。 如果有 0 或 1 個數字列,則循環將永遠運行,因為 0<=1 且 1<=1。 如果至少有 2 個數字列,則循環根本不會運行,因為 2(或更多)<=1 始終為 false。 測試應該是這樣的:
i <= N Items( Numeric Columns )
這會測試您的迭代器 (i) 是否大於列數,並在大於時停止。
2. 在 For Each Row 循環中,您仍然需要對行進行下標,只是不必自己管理迭代。 所以這一段:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
應該看起來像這樣:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)[Row()]</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
3. 您的 Count 變量是一個列表,但您將其視為數字。 Count++ 不會對未填充數字的列表執行任何操作。 設置 Count = 0 而不是 Count = {}。 此外,Count++ 返回當前值,然後將 Count 設置為 Count +1。 所以 Count = Count++ 永遠不會改變 Count 的值。 (示例:計數 = 0。 計數 = 計數++。 計數仍然等於零。)
這是經過上述更改的完整腳本。 最終計數是所有數字列中小於 101 的單元格數。
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = 0;
//Column loop
For( i = 1, i <= N Items( Numeric Columns ), i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i])[Row()] < 101,
Count++;
Show( Count );
)
)
);
哈特哈,
梅蘭妮
回复:JSL:如何循環遍歷列、生成圖形生成器報告並將每個報告保存為 JPG 文件@阿卜杜爾吉,
您可以使用矩陣來識別要測試的條件。 這是一個例子,
Clear Log();
// Open a sample data set
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Extracting numeric column names
ColNames = dt << Get Column Names("String");
NumericCols = [];
for(nCol = 1, nCol <= N Items(ColNames), nCol++,
DType = Column(dt,nCol) << Get Data Type;
If(DType == "Numeric",
NumericCols = NumericCols || nCol;
);
);
NumericColNames = ColNames[NumericCols];
// Extract numeric data only
Mat = dt << Get As Matrix;
// Row Wise Test
// For e.g. Find all rows where year < 90
YearCondition = Loc(Mat[0,1] < 90);
Show(Mat[YearCondition,0]);