Empilez des tableaux côte à côte à partir d'Excel et ajoutez des colonnes d'en-têteJe lutte depuis 2 jours pour extraire des données d'Excel vers JMP au bon format.
J'ai des centaines de feuilles Excel, mais les données sont désorganisées. Il y a de nombreux tableaux côte à côte (des centaines) dans une feuille Excel.
Je souhaite empiler les données sur différentes tables, mais aussi créer de nouvelles colonnes avec les données d'en-tête associées. Je n'ai réussi à le faire que sur une seule table, mais je ne peux pas le reproduire sur toutes les tables ou feuilles de différents documents Excel. Les feuilles ont également tendance à avoir des noms d'onglets différents, mais si je pouvais le faire fonctionner sur un seul document Excel, ce serait parfait.

Organisation du contenuWindowsRe : Empiler des tableaux côte à côte à partir d'Excel et ajouter des colonnes d'en-têtePouvez-vous fournir un exemple de fichier Excel ? Si vous avez peu de types de fichiers différents, avoir plus d'exemples facilitera la réponse.
Re : Empiler des tableaux côte à côte à partir d'Excel et ajouter des colonnes d'en-têteSalut Jarmo,
Tout à fait, j'ai joint des données factices. Il peut y avoir jusqu'à 200 tableaux côte à côte, et j'ai ajouté différentes feuilles de calcul dans le même fichier Excel juste pour montrer les changements de noms d'onglets. En réalité, ces feuilles se trouvent souvent dans des feuilles Excel distinctes au sein d'un même dossier. Les surlignages jaunes indiquent les endroits où de nouveaux en-têtes seraient nécessaires, je pense, et le surlignage orange est simplement là parce que, dans l'ensemble de données réel, il y a quelques centaines de lignes vides avant que ces données ne commencent.
Idéalement, j'aimerais intégrer tous les paramètres (paramètres 1 à 19, il y en a plus lorsque vous faites défiler vers le bas dans Excel) sous un en-tête de paramètres, et les valeurs sous un en-tête de valeur, et ajouter des colonnes pour montrer que ces données appartiennent aux valeurs header1/2/3 (et nouvelles 4) en ajoutant des colonnes comme dans le message d'origine.
En fin de compte, je chercherai également à enregistrer les deux ensembles de données (colonnes d'en-tête VCL et VL) de la même manière avec un identifiant des en-têtes 1/2/3 (et 4).
Faites-moi savoir si vous avez des idées, ce serait très apprécié !
Merci
Lewis
Re : Empiler des tableaux côte à côte à partir d'Excel et ajouter des colonnes d'en-têteCe ne sera pas facile, car, pour être honnête, ces données sont horriblement formatées. La meilleure solution serait de les corriger à la source, mais c'est rarement possible.
Je commencerais par extraire les données dans JMP aussi brutes que possible, donc quelque chose comme ça


À partir de là, je commencerais à créer un script, car ces données posent trop de problèmes à gérer sans JSL (vous pouvez probablement aller assez loin sans JSL, mais avec JSL, ce sera beaucoup plus simple). Corriger la première ligne d'en-têtes est probablement la première chose à faire, car cela facilitera la séparation des « tables » et de leurs données.
Re : Empiler des tableaux côte à côte à partir d'Excel et ajouter des colonnes d'en-têteJ'ai modifié le fichier Excel que vous avez fourni pour le simplifier un peu, mais l'idée serait la même s'il était plus complexe. Je ne gérerai qu'une seule feuille de calcul, mais il est facile de parcourir plusieurs feuilles.
Données de départ

Importation dans JMP (pour une raison quelconque, JMP veut supprimer la première colonne vide même si je ne lui ai pas dit de le faire, mais ce n'est pas grave)

Nos données de départ

À ce stade, j'opterai immédiatement pour JSL, mais vous pourriez facilement effectuer un nettoyage grâce aux fonctionnalités interactives de JMP. Notez que cette solution ne gère pas les différents types de problèmes liés aux données (en-têtes manquants, paramètres dupliqués), car je ne sais pas comment les résoudre.
Voir plus...
Names Default To Here(1);
dt = Open(
"$DOWNLOADS/Book1.xlsx",
Worksheets("Sheet1"),
Use for all sheets(0),
Concatenate Worksheets(0),
Create Concatenation Column(0),
Worksheet Settings(
1,
Has Column Headers(0),
Number of Rows in Headers(1),
Headers Start on Row(1),
Data Starts on Row(1),
Data Starts on Column(1),
Data Ends on Row(0),
Data Ends on Column(0),
Replicated Spanned Rows(0),
Replicated Spanned Headers(0),
Suppress Hidden Rows(0),
Suppress Hidden Columns(0),
Suppress Empty Columns(0),
Treat as Hierarchy(0),
Multiple Series Stack(0),
Import Cell Colors(0),
Limit Column Detect(1),
Column Separator String("-"),
Column Numeric Format(Index(0), Column Name(Column 1), Datatype("Character"))
)
);
// turn everything after this into functions/expressions which you can easily run on different sheets
// Take only useful data: header which belongs to parameters (first two rows)
// Parameter rows
header_rows = [1, 2];
param_rows = dt << Get Rows Where(Starts With(:Column 1, "Parameter"));
dt_headers = dt << subset(Rows(header_rows), Selected Columns(0), Output table("Data Header"));
dt_params = dt << subset(Rows(param_rows), Selected Columns(0), Output table("Data Parametere"));
Close(dt, no save);
// Drop empty columns
For Each({colname}, dt_params << Get Column Names("String"),
If(Col Number(Column(dt_params, colname)) == 0,
dt_params << Delete Column(colname)
);
);
dt_result = dt_params << Stack(
columns(dt_params << Get Column Names("String")),
Stack By Row(0),
Drop All Other Columns(1),
Number of Series(2),
Output Table("Result")
);
// Close(dt_params, no save);
// Cleanup some columns
dt_result << Delete Columns(1, 3);
Column(dt_result, 1) << Set Name("Name");
Column(dt_result, 2) << Set Name("Value");
// Add grouping for header joining
new_col = dt_result << New Column("Group", Numeric, Ordinal, Formula(
Col Cumulative Sum(1, :Name)
));
dt_result << run formulas;
new_col << Delete Formula;
headers = dt_headers[1, 0];
header_count = N Items(Associative Array(headers));
dt_headerstack = Eval(EvalExpr(dt_headers << Stack(
columns(dt_headers << Get Column Names("String")),
Stack By Row(0),
Number of Series(Expr(header_count)),
Output Table("header stack")
)));
// Close(dt_headers, no save);
// drop unnecessary columns
dt_headerstack << Delete Columns(1::N Cols(dt_headerstack)::2);
// Move header columns and remove extra header rows
dt_headerstack << Move Up;
rows_to_delete = dt_headerstack << Get Rows Where(Starts With(Column(dt_headerstack, 1)[], "Header"));
dt_headerstack << Delete Rows(rows_to_delete);
// Add grouping for update
new_col = dt_headerstack << New Column("Group", Numeric, Ordinal, Formula(
Row()
));
dt_headerstack << run formulas;
new_col << Delete Formula;
dt_result << Update(
With(dt_headerstack),
Match Columns(:Group = :Group)
);
Close(dt_headerstack, no save);
Close(dt_headers, no save); // close earlier
Close(dt_params, no save); // close earlier
Close(dt, no save); // close earlier
/*
sheetList = Get Excel Worksheets("$DOWNLOADS/Book1.xlsx"); // for sheet list to loop over
*/
Fichier Excel et fichier de résultats JMP joints
Re : Empiler des tableaux côte à côte à partir d'Excel et ajouter des colonnes d'en-têteC'est excellent, merci ! Cela fonctionne très bien pour le fichier d'exemple. Je vais commencer à faire un peu de nettoyage et voir ce que cela me donne. Cela semble être une excellente solution, merci !