Quelle est la manière appropriée / efficace de filtrer les données + l'utilisation des noms de colonnes dynamiques?Je travaille actuellement sur un script qui filtre la table de données à l'aide de Get Rows Where
Ensuite, j'utilise les lignes pour obtenir les valeurs dans une liste.
Ci-dessous fait partie de mon script:
rows = main_dt << Get Rows Where(
As Column(G_TEMP_COL_STR) == M_TEMP &
As Column(G_WAFER_COL_STR) == M_WAFER
);<BR /><BR />values_list = As Column(main_dt,G_TEMP_COL_STR)[rows];J'aimerais savoir:
- Existe-t-il une meilleure façon de le faire?
- Pourquoi As Column () est-il lent comparé à l'utilisation directe de: ?
- J'utilise As Column parce que je l'ai fait pour pouvoir attribuer des colonnes spécifiques sur une interface graphique
Re: Quelle est la manière appropriée / efficace de filtrer les données + l'utilisation des noms de colonnes dynamiques?Vous ne fournissez pas suffisamment d'informations pour que je puisse vous dire s'il existe une meilleure solution. "Get Rows Where" est très efficace, sauf si vous l'utilisez beaucoup. Il fait un tour complet des données pour obtenir ses résultats. Si vous faites cela souvent, il peut être préférable d'utiliser une méthode différente qui réduit le nombre d'analyses de données complètes.
Vous avez déclaré que l'utilisation de As Column () est plus lente que l'utilisation d'une référence directe à un nom de colonne. Si c'est ce que vous avez déterminé, vous pouvez modifier votre code comme suit. Il transmettra à JSL une version codée en dur de votre Get Rows Where ().
G_TEMP_COL_STR="Height";
M_TEMP =72;
G_WAFER_COL_STR = "WAFER_NUM";
M_WAFER =12;
G_VALUE_COL_STR = "Values";
Eval(Parse("rows = main_dt << Get Rows Where( :" ||
G_TEMP_COL_STR || " == \!"" || Char(M_TEMP) || "\!" & :" ||
G_WAFER_COL_STR || " == " || Char(M_WAFER) || " );
values_list = main_dt:" || G_VALUE_COL_STR || "[rows];" ));
Re: Quelle est la manière appropriée / efficace de filtrer les données + l'utilisation des noms de colonnes dynamiques?Merci @txnelson ! Oui, il est appelé comme 50 fois ou plus et cela dépend du nombre de combinaisons de plaquette, de température et de vcc (ajouté). J'ai obtenu les mêmes performances en utilisant le code ci-dessus. En fait, j'ai aussi essayé de faire
main_dt:Eval(G_TEMP_COL_STR) == M_TEMP
mais il est encore sensiblement plus lent par rapport à faire
:temperature = M_TEMP
Je pense que ce doit être la chaîne d'évaluation qui la ralentit.
J'ai fait une solution de contournement "paresseux / moche", j'ai gardé le
Get Rows Where( :temperature == M_TEMP ...)
Et renommé la colonne que j'ai sélectionnée dans l'interface graphique en température pour y correspondre.
As Column(dlg_ret[2]) << Set Name( "temperature" );
Il fonctionne rapidement comme prévu mais renomme les noms des colonnes.
Re: Quelle est la manière appropriée / efficace de filtrer les données + l'utilisation des noms de colonnes dynamiques?L'exemple donné par @txnelson peut être simplifié (OMI) en utilisant également le EvalInsert fonction: cela permet une substitution de variable basée sur le symbole caret (^). De plus, la notation \ [...] \ peut être utilisé pour que les guillemets puissent être utilisés sans avoir à utiliser de séquences d'échappement. Il est donc finalement possible d'écrire:
Eval(Parse(EvalInsert("\[
rows = main_dt << Get Rows Where(
:^G_TEMP_COL_STR^ == "^M_TEMP^" &
:^G_WAFER_COL_STR^ == "^M_WAFER^"
);
]\")));
Ce style de code pourrait également être utilisé pour référencer la colonne au lieu de
values_list = main_dt:Eval(G_VALUE_COL_STR)[rows]
Mais je ne sais pas pourquoi vous ne pouvez pas simplement écrire:
values_list = column(main_dt,G_VALUE_COL_STR)[rows];