renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéBonjour,
Je suis novice en JSL, alors appréciez votre aide.
J'ai trois fichiers.
fichier #1 : C'est le fichier de référence, [comme ref.csv] contenant 3 colonnes comme ci-dessous.
Catégorie, largeur, étiquette
--------------------------------
A,0,L1.abc
A,1,L2.xt
A,2,L8.dr
A,3,L20.ws
A,4,L72.oz
B,0,L11.qq
....
B,6,L61.er
fichier n°2 : fichier de données n°1 dans JMP, contenant la catégorie, les données et de nombreuses autres colonnes.
fichier #3 : fichier de données #2 dans JMP, contenant Category, Data et de nombreuses autres colonnes.
la différence entre les deux fichiers de données [Fichier #2 et fichier #3] est le type de catégorie et la largeur de la valeur dans la colonne de données.
Fichier de données #1 :
Catégorie|données|nombreux cols.....
----------------------------------------
A 123.23 ....
A 321.45....
.....
plusieurs rangées
la largeur des valeurs dans la colonne "données" [à l'exclusion des points] correspond au nombre de lignes dans le fichier #1 pour une catégorie donnée
exemple:
la largeur de 123,23 dans la ligne 1 du fichier de données n° 1 est de 5.
le nombre de lignes dans le fichier de référence pour la catégorie A serait de 5. cela n'a pas besoin d'être testé à proprement parler. c'est ainsi que les tables arrivent [c'est-à-dire lorsqu'elles sont extraites de la source]
À l'avenir, dans le fichier de référence, par exemple pour la catégorie A, le nombre de lignes augmente à 6 ou plus, la largeur de la valeur contenue dans la colonne de données du fichier de données de fichier #1 augmentera également lorsque les informations sont extraites de la base de données.
Fichier de données #2 :
Catégorie|données|nombreux cols.....
----------------------------------------
B 1236.23 ....
B 3213.45 ....
.....
plusieurs rangées
Objectif 1 : créer de nouvelles colonnes en fonction de la largeur de la valeur contenue dans la colonne "données" du fichier de données n° 1 [et d'autres fichiers de données]
J'en ai fini avec l'objectif #1 !
ex:
le fichier de données mis à jour #1 ressemblerait à ceci :
Catégorie|données|c1|c2|c3|c4|c5|nombreux cols.....
----------------------------------------
A 123.23 1 2 3 2 3 ....
A 321.45 3 2 1 4 5 ....
.....
objectif 2 : renommer les nouvelles colonnes du fichier de données #1 [c'est-à-dire c1 à c5] en L1... en L72... comme défini dans la colonne "label" du fichier de référence. aucun changement dans les valeurs des cellules, il suffit de mettre à jour les noms de col sélectionnés.
résultat attendu une fois l'objectif 2 atteint :
Mettez à jour le fichier de données #1 pour qu'il ressemble à ceci :
Catégorie|données|L1.abc|L2.xt|L8.dr|L20.ws|L72.oz|beaucoup de cols.....
----------------------------------------
A 123.23 1 2 3 2 3 ....
A 321.45 3 2 1 4 5 ....
.....
J'ai besoin d'aide pour l'objectif n° 2.
Pour l'objectif n°2 j'ai ouvert le fichier de référence mais pas sûr d'avancer.
Merci
David
Accès aux donnéesPersonnalisation de masseRe : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéOK ..... c'est un peu pointilleux ..... mais ce qui se trouve dans dataTablesList n'est pas une liste de noms de tables de données mais des fonctions data table (), qui pointent vers des tables de données.
{"Table1","Table2"} // Une liste de noms de tables de données
{ data table( "Table1" ), data table( "Table2" ) } // une liste de pointeurs vers des tables de donnéesRe : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéouais. j'ai compris. contient le nom de la table de données
-David
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparédataTableList ne contient pas les tables de données, il ne contient que des pointeurs vers les tables. Créer la liste puis exécuter
Show( dataTableList );
et vous verrez ce qui est dans la liste.
Vous pouvez également voir ce qui est dans la liste, en passant simplement votre souris sur la variable, et il affichera sa valeur
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéMerci Jim. Avec des modifications mineures [à mes besoins] ça marche ! Merci !!
Question, la liste [datatableList] peut-elle contenir beaucoup d'informations ?
Chacune de mes tables a beaucoup de lignes comme des milliers et a également de nombreuses colonnes.
-David
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéDésolé pour ma désinformation.J'ai mal interprété la structure de la table de données Catégories.Vous trouverez ci-dessous un script qui crée quelques tables de données et une table de catégories, puis développe les tables de données et renomme enfin les colonnes en fonction des entrées de la table de données des catégories.J'espère que cela nous remettra sur la bonne voie.Le script fonctionnera sur autant de tables de données que nécessaire.Il suffit d'ajouter à la liste dataTableList, toutes les tables de données à traiter
Names Default To Here( 1 );
// This example script opens up 2 data tables and 1 category table.
// In reality, as many as necessary data tables could be used
// Create the tables
dt1 = New Table( "Table1",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"ABC", "ABC", "ABC"} ) ),
New Column( "DATA", Character( 33 ), "Nominal", Set Values( {"123.56.8.342", "431.02.0.567", "318.00.1.816"} ), Set Display Width( 182 ) )
);
dt2 = New Table( "Table2",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"B", "B", "B"} ) ),
New Column( "Data", Character, "Nominal", Set Values( {"13.24", "98.44", "63.89"} ) )
);
dtCat = New Table( "The Categories",
Add Rows( 13 ),
New Column( "Category",
Character,
"Nominal",
Set Values( {"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "B", "B", "B", "B"} ),
Set Display Width( 67 )
),
New Column( "Width", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3] ) ),
New Column( "Label",
Character( 16 ),
"Nominal",
Set Values(
{"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7", "label0.8", "thelabel.1", "thelabel.2",
"thelabel.3", "thelabel.4"}
),
Set Display Width( 99 )
)
);
// Below this line, is the script that will add the new columns to each of the data tables
// and will take the names from the dtCat (Categories) data table and change the names to
// the columns in each of the data tables
// Create a list of the pointers to the data tables. This will allow for the using of the list
// entries to point to the data tables using a subscript
dataTableList = {};
insert into(dataTableList, dt1 );
insert into(dataTableList, dt2 );
// Loop across the data table list and expand the columns based upon the the column called Data
For( i = 1, i <= N Items( dataTableList ), i++,
ncols_to_add = length( substitute((dataTableList[i]:Data)[1],".",""));
For( k = 1, k <= ncols_to_add, k++, // the || operator joins two strings
dataTableList[i] << New Column( "c" || Char( i ),
Numeric,
Continous,
<<SET each="" value=""></SET>Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéJim,
Pour l'étape 2 avec les modifications ci-dessous [illustrées ci-dessous]
++++
c'est ma ref.csv :
catégorie|largeur|étiquette
ABC 0 étiquette0.0
Etiquette ABC 10.1
Etiquette ABC 20.2
Etiquette ABC 30.3
Etiquette ABC 40.4
Etiquette ABC 50.5
Étiquette ABC 60.6
Étiquette ABC 70.7
Étiquette ABC 80.8
Étiquette ABC 90.9
Etiquette ABC 100.10
Étiquette ABC 110.11
Étiquette ABC 120.12
Étiquette ABC 130.13
Etiquette ABC 140.14
Etiquette ABC 151.15
Étiquette ABC 160.16
Étiquette ABC 170.17
Etiquette ABC 180.18
Étiquette ABC 190.19
Etiquette ABC 200.20
B 0 étiquette11.22
C 1 étiquette11.21
Etiquette D 211.23
Etiquette E 011.24
Mon code :
dt_ref = Ouvrir ("ref.csv");
For( i=1, i<= N Rows( dt_ref ), i++,
insérer dans(Category_List, word(1,:label[i],"".") || "." || word(2,:label[i], "." ) );
);
show(Category_List);
+++
J'obtiens ce qui suit sur le journal:
Category_List = {"étiquette0.0", "étiquette0.1", "étiquette0.2", "étiquette0.3", "étiquette0.4", "étiquette0.5", "étiquette0.6", "étiquette0.7" , "étiquette0.8", "étiquette0.9", "étiquette0.10", "étiquette0.11", "étiquette0.12", "étiquette0.13", "étiquette0.14", "étiquette1.15", " étiquette0.16", "étiquette0.17", "étiquette0.18", "étiquette0.19", "étiquette0.20", "étiquette11.22", "étiquette11.21", "étiquette11.23", "étiquette11. 24", ".", "."} ;
Je veux qu'il sélectionne les étiquettes uniquement lorsque la catégorie est ABC. comment je fais ça?
J'ai essayé ce qui suit mais rien n'est renvoyé pour la Category_List :
prod_found ={"ABC"} ;
si (:product == prod_found,
For( i=1, i<= N Rows( dt_ref ), i++,
insérer dans(Category_List, word(1,:name[i],"".") || "." || mot(2,:nom[i], "." ) );
);
);
Merci,
David
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéJ'ai regardé le code que vous m'avez fourni.. Il semble y avoir une certaine confusion.
c'est comme ça que j'ai intercepté et corrigez-moi c'est faux.
dtcat est la table de référence avec le nom col [ Catégorie, largeur, étiquette].
il y a plusieurs tables de données dt1, dt2 etc avec la même structure avec des noms de col [Catégorie | données | plusieurs cols .....]
quand je lance le code, ça ne fait rien
il n'y a pas de colonne nommée data dans la table dtcat et a examiné le débogage.
Vous vouliez peut-être dire table dt1 car il s'agit d'une colonne de données.
J'ai essayé de jouer et ça n'a pas aidé.
Je pense que nous sommes alignés sur les définitions du tableau, utilisez ce que j'ai décrit dans le message d'origine, je pourrais vous aider à mon avis.
Encore une fois, appréciez l'aide ici.
Laissez-moi la recommandation pour l'étape 2
Merci
David
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparé- Vous indiquez que mon dernier code ne fonctionne pas... pourquoi pas ?
- Voici un moyen de créer la liste que vous demandez
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéMerci Jim.Ça ne marche pas.
Donc, pour l'objectif n ° 2, j'ai décomposé toute la logique en étapes de valeurs.
étape 1: récupérez les noms de catégories à partir de la table de données [disons dt1] et stockez-les dans une variable [disons qu'il contient la catégorie A] - TERMINÉ
step2: lire la variable de step1 et trouver toutes les lignes qui correspondent à category = A] obtenir les noms d'étiquettes de la colonne "Label" du ref.csv, [que vous avez appelé comme dtCat], et le stocker dans une liste ou une variable. [ dites qu'il s'appelle category_list]
donc en utilisant l'exemple indiqué dans la discussion. Je m'attends à ce que category_list contienne des valeurs inférieures.
liste_catégorie = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
Je ne sais pas comment faire ça. Apprécier l'aide.
étape 3 : Vérifiez le nombre dans la liste == non. de nouveaux cols créés dans le dt1. c'est une chose supplémentaire que je fais pour la robustesse.
compter dans category_list est de 5 éléments
les nouveaux cols créés dans dt1 sont 5. [Je l'ai obtenu de l'objectif 1 car je tiens une variable pour trouver combien de nouveaux cols sont nécessaires].
Étape 4 : remplacez les noms de cols dans dt1 , c'est-à-dire c[i] par la liste [i] en utilisant la boucle où i = 5
c1 remplacé
Je suis actuellement à l'étape 2 et j'ai besoin d'aide.
Merci,
David
Re : renommer les noms de colonne dans un fichier jmp selon les valeurs des lignes dans un fichier .csv séparéVoici un script non testé, qui devrait être assez proche de pouvoir atteindre votre deuxième objectif
dtCat = Data Table( "file#1 name" );
dt1 = Data Table( "file#2 name" );
dt2 = Data Table( " file#3 name" );
// add dt3, dt4 etc. for each of the categories you have
// Find the number of data tables to process....A B C......
// Create a temporary new column in data table dtCat that has just the category
dtCat << New Column( "temp", character, formula( Word( 1, :data, "." ) ) );
// Summarize the data getting one element in the ByGroup list for each Category found
Summarize( dt, Categories = ByGroup( :temp ) );
numCategories = N Items( Categories );
For( i = 1, i <= numCategories, i++,
// Subset the dtCat table into the a new data table with just the one
// category being processed
dtCat << select where( :temp == Categories[i] );
dtSub = dtCat << subset( selected rows == 1, selected columns( 0 ) );
// set the offset of where to start the renaming
offset = 3;
// Loop
// Change names in dt1 to match the Label in
For( k = 1, k <= N Rows( dtSub ), k++,
Eval(
Substitute(
Expr(
Column( __dt__, k + offset ) << set name( Word( 3, dtSub:Data[k], "." ) ),
Expr( __dt__ ),
Parse( "dt" || Char( i ) )
)
)
)
);
Close( dtSub, nosave );
);