Concaténer et supprimer des formulesGens,
J'ai plusieurs tables (échantillons) qui ont de nombreuses formules de colonnes actives. Mon script à un moment donné, concatène toutes les tables. Cependant, je souhaite que les formules soient supprimées car je souhaite conserver intactes les données de la table individuelle (échantillon) afin de comparer / superposer toutes les données concaténées. Malheureusement, je n'arrive pas à désactiver correctement les formules lorsqu'elles sont concaténées, et les colonnes nouvellement concaténées sont en cours d'évaluation, ce qui perd les exemples de données individuels. Je pensais avoir ce battement avec le code attaché, mais lorsque j'ai recopié la table initiale dans un autre dossier, les formules "réactivées" causaient une certaine frustration. S'il y a une bonne solution, je suis ouvert à toute entrée car l'évaluation de la formule de suppression ne fonctionne pas dans l'implémentation actuelle.
Neil
Con = Expr(
n = N Table();
dt = {};
// Sort list ascending (sample replicates)
For( i = 1, i <= n, i++,
table = data table(i);
insert into(dt, table);
sort list into(dt)
);
// Concatenate each file (sample replicates)
dt_all = Data Table( dt[1] );
For(i = 1, i <= n, i++,
If(i > 1,
Suppress Formula Eval(suppress=1);
dt_all << Concatenate(Invisible, dt[i], Append to first table);
)
);
Current Data Table(dt_all);
);
Accès aux donnéesIngénierie de la qualité et des procédésRe : Concaténer et supprimer des formulesJarno,
Grande entrée. En fait, je commençais à regarder la route "Is Empty" hier soir. Donc, pour finaliser la discussion sur l'élimination des formules et la concaténation, j'ai pris vos suggestions et mis à jour mes compétences en codant vos suggestions. De plus, selon mon message et mon code d'origine, j'ai fait des mises à jour qui ont également fonctionné.
- Le premier bloc utilise l'instruction "Is Empty" pour ne distinguer AUCUNE colonne de formule et éliminer simplement les formules du reste.
- Le deuxième bloc utilise "Try" que je n'ai pas bien compris au début lorsque vous l'avez suggéré même après avoir regardé l'index de script. Je pensais que l'exécution s'arrêterait comme les tentatives précédentes, mais évidemment pas.
- Le troisième bloc utilise "Suppress formula eval" pour la première table ouverte. Toutes les autres tables sont concaténées à cette première table, ce qui donne également une sortie souhaitée où les colonnes de table concaténées finales ne sont pas évaluées.
Je ne saurais trop vous remercier pour toutes vos contributions qui m'ont aidé à améliorer mes compétences.
Neil
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
result = Column(file_1, CN[j]) << Get Formula;
y = Is Empty(result);
If(y==0, Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
Try(Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1 << Suppress Formula Eval(1);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Re : Concaténer et supprimer des formulesSi vous n'avez pas nécessairement besoin des formules, vous n'avez même pas besoin de les créer car vous pouvez utiliser << Définir chaque valeur au lieu de la formule (ou supprimer les formules immédiatement après la création). Mais si vous en avez besoin, vous pouvez vérifier si la colonne a une formule avec << obtenir la formule et si le résultat est Empty() alors la formule n'existe pas (utilisez IsEmpty() pour vérifier la formule manquante) ou vous pouvez "force brute " avec Try-catch.
Obtenir la formule :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
result = col << Get Formula;
Show(result, IsEmpty(result));
col << Set Formula(:Height / :Weight);
col << Eval Formula;
result = col << Get Formula;
Show(result, IsEmpty(result));
Essayez-catch :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
Try(col << Delete formula, show(exception_msg)); //the show part isn't necessary
Ensuite, si vous voulez boucler juste sur les colonnes qui ont des formules, vous pouvez boucler sur la liste et en créer une nouvelle (si vous avez JMP16, utilisez Filter Each).
Il y a aussi quelques messages dans la communauté sur la façon de supprimer toutes les formules du tableau, en voici un par exemple : Rechercher et supprimer toutes les formules présentes dans un tableau
Re : Concaténer et supprimer des formulesJarmo,
Merci beaucoup d'avoir éclairé le problème. Je ne savais pas qu'il y aurait un problème sans une formule existante. Avec ce fait à l'esprit, j'ai créé une instruction conditionnelle pour la première table. Cela a évidemment fonctionné puisque "file_1" a la formule de colonne spécifique supprimée une fois. Le code ci-joint a fonctionné pour l'exemple de colonne unique.
Maintenant qu'il est compris qu'une formule doit être présente, le problème est que toutes les colonnes n'ont pas de formules. Donc, si je récupère tous les noms de colonnes, il y aura un sous-ensemble qui n'a pas de colonnes associées. Existe-t-il un moyen de tester si une colonne contient une formule afin qu'une liste appropriée puisse être construite en boucle? Ou est-ce que je "force brutalement" le problème en configurant une liste dans JSL que je devrai mettre à jour chaque fois que j'ajouterai une formule à une colonne?
Neil
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");
Re : Concaténer et supprimer des formulesÊtes-vous sûr d'essayer d'accéder à la table de données correcte ? Vous ouvrez toujours le même fichier que file_1 dans la boucle for.
Vous pouvez ajouter des impressions de débogage à l'intérieur de la boucle for pour vous aider à découvrir quel est le problème, par exemple :
file_1 = Open(SD1 || b[1]);
show(file_1);
show(file_1 << Get Column Names("String")); //depending how many columns you have might not want to do this
show(Contains(file_1 << Get Column Names("String"), "Pore Diameter (um)"));
file_1:"Pore Diameter (um)" << delete formula;N'oubliez pas non plus de fermer les tables de données dont vous n'avez plus besoin avec Close(dtref, no save);
Re : Concaténer et supprimer des formulesDésolé pour la réponse tardive. J'apprécie tous les retours.
Sans encore attaquer toutes les colonnes, j'ai juste essayé d'éliminer une formule dans une colonne particulière. Lorsque j'applique la ligne "supprimer la formule" en dehors de la boucle, j'obtiens le résultat souhaité, c'est-à-dire qu'aucune formule n'existe. Cependant, si la même ligne va dans la boucle, après l'ouverture du fichier, j'obtiens l'erreur suivante :
"Column Pore Diameter (um) has no formula in access or evaluation of 'delete formula' , delete formula/*###*/"
De toute évidence, je n'ai pas encore compris la mécanique pour voir pourquoi il y a un problème. Seriez-vous en mesure de donner un aperçu?
Merci beaucoup.
For( i=1, i <= N Items(b), i++,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, Append to first table);
);
);
//file_1:"Pore Diameter (um)" << delete formula;
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Re : Concaténer et supprimer des formulesJMP est également capable de le faire de manière interactive avec Standardize Attributes :
Sélectionnez toutes les colonnes, faites un clic droit sur l'une des colonnes et sélectionnez Standardiser les attributs :

Ajoutez une formule pour supprimer les propriétés et appuyez sur OK (ou appliquez):

Si vous avez JMP16, cela sera imprimé dans le journal amélioré :
// Open Data Table: Wheat.jmp
// → Data Table("Wheat")
Open("$SAMPLE_DATA/Wheat.jmp");
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("Wheat"));
For Each({col, index},
{:Variety, :Yield, :Moisture, :Pred Formula Yield, :Cond Pred Formula Yield},
col << Delete Formula
);
Current Data Table(old dt);
);
Et cela vous donnera une bonne idée de la façon de gérer cela (comme l'a dit txnelson, faites une boucle sur la liste et supprimez les formules au fur et à mesure). Vous pouvez également obtenir toutes les colonnes du tableau avec << Get Column Names. Vous ne pourrez pas supprimer les formules des colonnes qui n'en ont pas (et le script fourni par le journal amélioré ne fonctionnera pas directement comme ça), mais vous pouvez contourner cela en enveloppant le col << Supprimer la formule avec Try(). Après avoir nettoyé le script de journal amélioré, vous pourriez vous retrouver avec quelque chose comme ceci :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Wheat.jmp");
For Each({col}, dt << get column names(String),
Try(Column(dt, col) << Delete Formula)
);Re : Concaténer et supprimer des formulesVous pouvez placer les noms de colonne dans une liste, puis parcourir la liste en boucle, en supprimant chacun d'eux.
Re : Concaténer et supprimer des formulesJim,
Merci pour la réponse. Puisqu'il y a environ 10 colonnes avec des formules par table, existe-t-il une approche "globale" pour supprimer tout en même temps ?
Neil
Re : Concaténer et supprimer des formulesCe que vous devez faire, c'est supprimer les formules avant la concaténation.Cela convertira les valeurs en valeurs statiques et vous n'aurez plus de problème.
:yourColumn << delete formula;