Après des heures de recherche sur Internet, il ne semble pas y avoir de réponse claire sur la façon d'accomplir ce que je veux faire et, après plusieurs tentatives de codage, c'est clairement l'un de ces domaines où JSL diffère considérablement des autres langages de programmation. J'ai des fichiers CSV qui sont utilisés comme bases de données dans un programme VBA personnalisé pour un client. La raison de l'utilisation des fichiers CSV était en grande partie due à la facilité d'importation de la base de données dans JMP pour effectuer des analyses périodiques sans avoir à créer une fonction d'exportation spécialisée, comme l'exigeait la version précédente de l'outil personnalisé. Je suis en train de créer un script pour importer le fichier de base de données et effectuer une préparation préliminaire afin que la table de données ait tout en place pour que l'analyse des performances puisse être effectuée. La plupart de cela est assez routinier et a été accompli jusqu'à présent dans mon script JSL.
Le problème que j'ai maintenant est que j'ai des valeurs nulles à plusieurs endroits qui devraient en fait être des valeurs manquantes. Les zéros résultaient de l'exportation des données depuis Excel à l'aide d'un objet de données dans VBA.Les données du fichier de base de données ne se trouvent jamais sur une feuille de calcul, car l'outil Excel personnalisé est entièrement basé sur l'interface graphique, de sorte que les données manquantes ont une valeur par défaut de 0 dans les propriétés qui composent l'objet de données dans le code ; VBA n'a pas d'équivalent de données manquantes pour les types de données numériques.
Ainsi, ce que je veux faire est de remplacer les zéros dans des colonnes spécifiques par des valeurs manquantes basées sur des drapeaux dans d'autres colonnes. Par exemple, si la colonne "Données de lectures annulées" contient "Faux" dans une ligne donnée, toutes les colonnes associées à une enquête de lectures annulées pour cette ligne doivent contenir des valeurs manquantes, car aucune enquête de lectures annulées n'a été menée pour cette ligne particulière. enregistrer. De même, si la valeur de la colonne "Enquête annulée" est "Vrai", toutes les colonnes de données d'enquête de cette ligne doivent contenir des valeurs manquantes car aucune enquête de quelque type que ce soit n'a été menée pour cet enregistrement. Avec les zéros en place, diverses statistiques seront faussées, car JMP inclura des enregistrements dans l'analyse qui doivent être ignorés.
J'ai essayé deux méthodes différentes en vain. La première consistait à utiliser une condition et à parcourir les colonnes :
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);Une partie du problème ici semble être que les références de colonne (vehiclePackageColumn et expiredReadsColumn) ne sont pas des numéros de colonne car l'utilisation de vehiclePackageColumn = Column("Vehicle Packages") ne renvoie pas le numéro de colonne pour la colonne "Vehicle Packages". En fait, je n'ai trouvé aucune information sur la façon de capturer l'index de colonne (numéro) pour les colonnes utilisant JSL.
La deuxième méthode était basée sur quelque chose que j'ai vu dans un autre forum:
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
Toute l'aide pouvant etre apportée serait très appréciée.
Essayé. Fonctionne très bien. Merci encore, Jim.
C'est facile:
colnames = dt << obtenir les noms de colonne (chaîne);
startindex = contains(colnames, "Le nom de votre colonne de départ");
endindex = contains(colnames, "Le nom de votre colonne de fin");
Oui!
Cela semblait résoudre le problème principal consistant à obtenir des valeurs manquantes dans une plage de colonnes en fonction de l'état des drapeaux dans des colonnes spécifiques, Jim. Ainsi, le seul problème restant est de savoir s'il existe un moyen de capturer les indices de colonne. Ma table de données est plutôt volumineuse et devoir compter manuellement les colonnes comme je l'ai fait lors de mon test de votre code suggéré est fastidieux et sujet aux erreurs; cette table de données particulière a 73 colonnes.L'absence d'un moyen de déterminer le numéro de colonne des colonnes nommées dans JSL est une grave omission, ne serait-ce que pour des opérations comme celle-ci.
Je pense que cela fonctionnerait:
dt = table de données actuelle();
For( i = votre numéro de col de départ, i <= votre numéro de col de fin, i++,
colonne ( dt, i ) [ dt << obtenir des lignes où ( : annulé lit les données == "True")] = .;
);