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 l'aide.
J'ai trois fichiers.
file # 1: C'est le fichier de référence, [as ref.csv] contenant 3 cols 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 # 2: fichier de données # 1 dans JMP, contenant Category, Data et de nombreux autres cols.
fichier n ° 3: fichier de données n ° 2 dans JMP, contenant la catégorie, les données et de nombreux autres cols.
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 n ° 1:
Catégorie | données | nombreux cols .....
----------------------------------------
Un 123,23 ....
Un 321,45 ....
.....
plusieurs lignes
la largeur des valeurs de la colonne "données" [à l'exclusion des points] correspond au nombre de lignes du fichier n ° 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 5.
le nombre de lignes dans le fichier de référence pour la catégorie A serait 5. cela n'a pas besoin d'être testé en soi. voici comment 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 augmenterait également lorsque les informations sont extraites de la base de données.
Fichier de données n ° 2:
Catégorie | données | nombreux cols .....
----------------------------------------
B 1236.23 ....
B 3213,45 ....
.....
plusieurs lignes
Objectif 1: créer de nouveaux cols en fonction de la largeur de la valeur contenue dans le col "data" du fichier de données n ° 1 [et d'autres fichiers de données]
J'ai fini avec l'objectif n ° 1!
ex:
Le fichier de données mis à jour n ° 1 ressemblerait à ceci:
Catégorie | données | c1 | c2 | c3 | c4 | c5 | plusieurs cols .....
----------------------------------------
A 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
.....
objectif 2: renommer les nouveaux cols du fichier de données # 1 [ie 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 colonne sélectionnés.
sortie attendue après que l'objectif 2 est atteint:
Mettez à jour le fichier de données n ° 1 pour qu'il ressemble à ceci:
Catégorie | data | L1.abc | L2.xt | L8.dr | L20.ws | L72.oz | many cols .....
----------------------------------------
A 123,23 1 2 3 2 3 ....
A 321,45 3 2 1 4 5 ....
.....
J'ai besoin d'aide avec l'objectif n ° 2.
Pour l'objectif n ° 2, j'ai ouvert le fichier de référence mais je ne suis pas sûr d'aller de l'avant.
Merci
David
Tableau de donnéesRe: 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 );
);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.
étape1: récupérez les noms des catégories à partir de la table de données [disons dt1] et stockez-les dans une variable [disons qu'elle contient la catégorie A] - FAIT
step2: lire la variable de l'étape1 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 les stocker dans une liste ou une variable. [dites-le appelé category_list]
donc en utilisant l'exemple indiqué dans la discussion. Je m'attends à ce que category_list contienne des valeurs inférieures.
category_list = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
Je ne sais pas comment faire ça. J'apprécie 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.
count in category_list est de 5 éléments
les nouveaux cols créés dans dt1 sont 5. [J'ai obtenu ceci du but 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 en ce moment à 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é- 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éJ'ai regardé le code que vous avez fourni. Il semble y avoir une certaine confusion.
c'est comme ça que j'ai intercepté et corrigé moi c'est faux.
dtcat est la table de référence avec le nom de la colonne [ Catégorie, largeur, étiquette].
il y a plusieurs tables de données dt1, dt2 etc. avec la même structure avec des noms de colonnes [Catégorie | données | beaucoup de 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 regardée dans le débogage.
Peut-être que vous vouliez dire table dt1 car il s'agit d'une colonne de données.
J'ai essayé de jouer et ça n'aiderait pas.
Je pense que nous sommes alignés sur les définitions sur le tableau, utilisez ce que j'ai décrit dans le message d'origine, je pourrais 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éJim,
Pour l'étape 2 avec les modifications ci-dessous [illustrées ci-dessous]
++++
c'est mon ref.csv:
catégorie | largeur | étiquette
Étiquette ABC 00.0
Étiquette ABC 10.1
Étiquette ABC 20.2
Étiquette ABC 30.3
Étiquette ABC 40.4
Étiquette ABC 50.5
Étiquette ABC 6 0,6
Étiquette ABC 70.7
Étiquette ABC 80.8
Étiquette ABC 90.9
Étiquette ABC 100.10
Étiquette ABC 110.11
Étiquette ABC 120.12
Étiquette ABC 130.13
Étiquette ABC 140.14
Étiquette ABC 15 1,15
Étiquette ABC 160.16
Étiquette ABC 170.17
Étiquette ABC 180.18
Étiquette ABC 190.19
Étiquette ABC 200.20
Étiquette B 011.22
Étiquette C 1 11.21
Étiquette D 2 11.23
Étiquette E 011.24
Mon code:
dt_ref = Ouvert ("ref.csv");
Pour (i = 1, i <= N lignes (dt_ref), i ++,
insérer dans (Category_List, word (1,: label [i], ".") || "." || mot (2,: étiquette [i], "."));
);
show (Category_List);
+++
J'obtiens ce qui suit sur le journal:
Category_List = {"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7" , "label0.8", "label0.9", "label0.10", "label0.11", "label0.12", "label0.13", "label0.14", "label1.15", " label0.16 "," label0.17 "," label0.18 "," label0.19 "," label0.20 "," label11.22 "," label11.21 "," label11.23 "," label11. 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 il n'est rien retourné pour la Category_List:
prod_found = {"ABC"};
si (: produit == prod_found,
Pour (i = 1, i <= N lignes (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éDésolé pour ma désinformation.J'ai mal lu la structure du tableau 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 finalement les colonnes en fonction des entrées de la table de données des catégories.J'espère que cela nous remettra sur les rails.Le script fonctionnera sur autant de tables de données que nécessaire.Il ne reste plus qu'à 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>