Recherche et remplacement à l'échelle d'une table dans un script<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai plusieurs grands tableaux de données (+100 000 enregistrements) qui ont été créés par un collègue en Europe.
Lors de la création des tableaux, le format de numérotation de l'UE a été utilisé, c'est-à-dire que le "," est le point décimal.
Je dois faire une substitution à l'échelle de la table pour remplacer le "," par un "." pour que la table fonctionne avec les scripts existants.
Je peux obtenir les noms de colonnes avec une instruction get column names(), mais je n'arrive pas à comprendre comment utiliser les instructions substitut(...) ou substitut dans(...) pour effectuer un remplacement en masse.
David
Re : Rechercher et remplacer une table dans un scriptSalut David,
J'ai eu le même problème mais inversement - un remplacement global du point par une virgule délimiteurs dans une série de fichiers journaux de processus.
J'ai trouvé que le moyen le plus simple de s'en sortir était de sauvegarder chaque fichier jmp en tant que fichier texte, puis de l'importer à l'aide de l'option « meilleure estimation » de JMP.
Il a remplacé les délimiteurs d'origine par celui attendu par le système (dans mon cas, "." a été remplacé par ", " ) et a reclassé les colonnes de catégorielles à continues. J'en ai fait un manuellement et j'ai utilisé la source pour un script traitant le reste.
Re : Rechercher et remplacer une table dans un scriptDiscussion intéressante.J'ai joué avec du code et j'ai obtenu 49 secondes pour un renommage global de 65 394 colonnes.PC Lenovo T420, Windows 7 64 bits, JMP 64 bits, 4 Go de RAM.
dt = ouvrir ( "$sample_data\Probe.jmp" ) ;
// Etendre le nombre de colonnes à 65000
// L'AVERTISSEMENT prend ~10 minutes !
pour ( je = 1 , je <= 65000 , je ++,
dt << nouvelle colonne ( "XYZ" || carboniser ( je ) , Numérique , Continu ) ;
) ;
start_dt = aujourd'hui () ;
liste_nom_col = dt << obtenir les noms de colonnes ( chaîne ) ;
NC = ncols ( dt ) ;
Pour ( je = 1 , je <= NC , je ++,
nom_col_one = liste_nom_col [ je ] ;
// Renommez la colonne uniquement si elle contient la chaîne en question
si ( contient ( nom_col_one , "X" ) ,
colonne ( je ) << définir le nom ( remplaçant ( nom_col_one , "X" , "D" )) ;
) ;
) ;
fin_dt = aujourd'hui () ;
imprimer ( carboniser ( fin_dt - start_dt ) || "secondes pendant" || carboniser ( NC ) || " Colonnes" ) ;
Re : Rechercher et remplacer une table dans un scriptJ'ai essayé d'appeler la boîte de dialogue de recherche en utilisant l'approche ci-dessous, mais cela ne fonctionne pas de manière fiable. On dirait que la boîte de dialogue est déconnectée lorsque les paramètres sont modifiés par script. Mais peut-être que quelqu'un pourra trouver un moyen d'améliorer le code.
Si ce fichier inhabituellement volumineux provient de l'extérieur de JMP, il peut être plus efficace de modifier les noms de colonnes avant l'importation, par exemple par un script Perl ou VBA qui peut éventuellement être déclenché depuis JSL (peut dépendre de la plate-forme).
dt = tableau de données actuel () ;
vieux = "C" ;
Nouveau = "Q" ;
dt << Amener la fenêtre au premier plan ;
// Appeler la boîte de dialogue de recherche et modifier les paramètres
Menu principal ( "Trouver" ) ;
w = fenêtre ( "Boîte de dialogue de recherche" ) ;
w [ Boîte d'édition de texte ( 1 )] << Définir le texte ( vieux ) ;
w [ Boîte d'édition de texte ( 2 )] << Définir le texte ( nouveau ) ;
si ( w [ Case à cocher ( 2 )] << obtenir , w [ Case à cocher ( 2 )] << ensemble ( 1 )) ;
si ( w [ Case à cocher ( 6 )] << obtenir , w [ Case à cocher ( 6 )] << ensemble ( 1 )) ;
si (( w [ Case à cocher ( 7 )] << obtenir ) == 0 , w [ Case à cocher ( 7 )] << ensemble ( 1 )) ;
w [ boîte à boutons ( 3 )] << Cliquez sur ;
//Menu principal( "Remplacer tout" );
Re : Rechercher et remplacer une table dans un scriptPeut-être que j'ai confondu ce que David demandait en fonction de son commentaire "Obtenir les noms des colonnes".J'avais l'impression qu'il voulait changer les noms de colonnes (pas les données de ligne réelles).En tout cas, c'est ce que j'essaie de faire.Je souhaite modifier le nom de plusieurs colonnes (c'est-à-dire supprimer "labdata" de chaque nom de colonne).C'est ce que fera mon script ci-dessus.En JSL, cela prend environ 19 secondes sur 85 000 colonnes.La « boîte de dialogue de recherche » ne prend qu'une fraction de seconde.
Des idées sur la façon de faire que sans boucle For (ou super efficace) ?
Merci,
Jacques
Re : Rechercher et remplacer une table dans un scriptAvec JMP 11 sur un MacBook Pro, j'obtiens « 2 secondes pour 5 800 lignes » ou 1,753558 secondes si j'utilise HP time( ) au lieu de Today( ).
Contrairement à ce qui est affirmé ci-dessus, la recherche et le remplacement intégrés sont ici beaucoup plus lents. Le code ci-dessous prend 16,27 secondes (le code suppose que la boîte de dialogue de recherche est "préparée" par une recherche manuelle précédente).
dt = ouvrir ( "$Sample_Data\Probe.jmp" ) ;
start_dt = Temps HP () ;
Menu principal ( "Remplace tout" ) ;
fin_dt = Temps HP () ;
imprimer ( carboniser (( fin_dt - start_dt ) / 1e6 ) || "secondes pendant" || carboniser ( n° ) || " Lignes" ) ;
Re : Rechercher et remplacer une table dans un scriptVoici un exemple avec une grande table de l'exemple d'ensemble de données.Il ne comporte que 5 800 lignes et prend 8 secondes.JMP 11 64 bits sur un Lenovo T420.Il serait intéressant de comparer différentes approches.
dt = ouvrir ( "$Sample_Data\Probe.jmp" ) ;
col_names = dt << obtenir les noms de colonnes ( numérique , Chaîne ) ;
pour ( je = 1 , je <= articles ( col_names ) , je ++,
colonne ( dt , col_names [ je ]) << Type de données ( Personnage ) ;
) ;
start_dt = aujourd'hui () ;
n° = nrows ( dt ) ;
col_names = dt << obtenir les noms de colonnes ( Chaîne ) ;
pour ( je = 1 , je <= articles ( col_names ) , je ++,
un_col = colonne ( dt , col_names [ je ]) ;
pour ( k = 1 , k <= n° , k ++,
un_col [ k ] = remplaçant ( un_col [ k ] , "." , "," ) ; // Remplace la décimale par une virgule
) ;
) ;
fin_dt = aujourd'hui () ;
imprimer ( carboniser ( fin_dt - start_dt ) || "secondes pendant" || carboniser ( n° ) || " Lignes" ) ;
Re : Rechercher et remplacer une table dans un scriptSalut David,
**Après avoir tapé tout cela, j'ai réalisé que la question originale avait été publiée il y a LONGTEMPS.Cependant, ma question "plus efficace" demeure si quelqu'un peut m'aider. **
J'essaie de comprendre la même chose.Une solution consiste à utiliser une boucle For et à parcourir chaque colonne individuellement, mais cela peut prendre un temps considérable en fonction de votre ensemble de données.Un exemple de code est répertorié ci-dessous pour votre référence.
dt = table de données actuelle ();
Pour( je=1,i<=ncol(dt),i++,
nom de famille = Colonne(i) << obtenir le nom ;
nouveau nom de col = munger(colname,1,"replacestring",""); // Vous pourriez faire une chose similaire avec la commande "Substitute"
Colonne (i) << Définir le nom (newcolname);
);
Est-ce que quelqu'un connaît un moyen plus efficace qu'une boucle For pour s'occuper de cela ?Par exemple, lorsque vous utilisez la boîte de dialogue standard « Rechercher et remplacer », cette opération s'exécute très rapidement.Cependant, sur environ 65 000 colonnes, l’approche For Loop prend un temps considérable.
Merci,
Jacques