Gestion de deux formats d'en-tête Excel différentsSalut tout le monde,
Je travaille sur un script JSL dans JMP pour automatiser l'importation de fichiers Excel de nomenclatures. Ces fichiers proviennent de sources différentes et ne suivent malheureusement pas un format cohérent.
Je traite de deux formats spécifiques :
- Format 1 : les en-têtes sont sur la ligne 5, les données commencent sur la ligne 6
- Format 2 : les en-têtes sont sur la ligne 6, les données commencent sur la ligne 7
Actuellement, mon script est codé en dur pour utiliser le format 1 (les en-têtes commencent sur la ligne (5)), mais je dois l'ajuster manuellement chaque fois que je reçois des fichiers au format 2.
Objectif : je souhaite rendre le script suffisamment intelligent pour détecter automatiquement le format correct et appliquer les paramètres d'importation appropriés (les en-têtes commencent sur la ligne, les données commencent sur la ligne), sans intervention manuelle.
Voici un extrait du script actuel :
For( i = 1, i <= N Items (namefiles), i++,
//Transformation du fichier en table de données
dt = Open(
namefiles[i],
Worksheets( "BOM" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 5 ),
Data Starts on Row( 6 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);<BR />...<BR />...<BR />...
Quelqu'un a-t-il rencontré un problème similaire ? Je recherche :
- Un moyen d'inspecter les premières lignes du fichier Excel (éventuellement à l'aide d'une importation temporaire) pour déduire le début réel de l'en-tête. Par exemple, en vérifiant les noms de colonnes connus.
- Ou toute technique JSL pour gérer ce type de variabilité de manière plus flexible.
Automatisation et scriptsFusion et nettoyage des donnéesIngénierie de la qualité et des procédésWindowsRe : Gestion de deux formats d'en-tête Excel différentsPourriez-vous fournir un échantillon de chacun des deux fichiers formatés ? Cela m'aiderait grandement à déterminer l'approche à adopter. En général, je lis les sept premières lignes comme une seule colonne. J'analyse ensuite le tableau pour déterminer son format, puis je lis l'intégralité du tableau en utilisant le format déterminé.
Re : Gestion de deux formats d'en-tête Excel différentsMerci beaucoup pour votre réponse.
Je joins les deux échantillons, un pour chaque format.
Je vais voir comment mettre en œuvre ce que vous avez suggéré pour voir si je peux lire avec succès les 7 premières lignes comme une seule colonne, puis analyser le tableau pour déterminer son format et lire le tableau complet en utilisant le format déterminé.
J'apprécie vraiment votre aide !
Re : Gestion de deux formats d'en-tête Excel différentsLa suggestion de Jim est une excellente option, une autre option serait d'extraire un peu plus de données, puis de faire le nettoyage dans JMP
Names Default To Here(1);
path = "$DOWNLOADS/BOM_191910000_Sample_Row5.xlsx";
//path = "$DOWNLOADS/BOM_212100000-A2_Sample_Row6.xlsx";
dt = Open(
path,
Worksheets("BOM"),
Use for all sheets(1),
Concatenate Worksheets(0),
Create Concatenation Column(0),
Worksheet Settings(
1,
Has Column Headers(0),
Data Starts on Row(5),
Data Starts on Column(1),
Data Ends on Row(0),
Data Ends on Column(0),
Replicated Spanned Rows(1),
Replicated Spanned Headers(0),
Suppress Hidden Rows(1),
Suppress Hidden Columns(1),
Suppress Empty Columns(1),
Treat as Hierarchy(0),
Multiple Series Stack(0),
Import Cell Colors(0),
Limit Column Detect(0),
Column Separator String("-")
)
);
header_row = Contains(dt[0, 1], "PART NUMBER");
If(header_row > 1,
dt << Delete Rows(1::header_row-1);
);
dt << Move up;
//empty_rows = dt << Get Rows Where(IsMissing(AsColumn(dt, 1)));
//dt << delete rows(empty_rows);Re : Gestion de deux formats d'en-tête Excel différentsDans vos feuilles de calcul, si le nom de la première colonne lue à l'aide d'en-têtes de longueur 6 contient un nombre valide, alors la ligne de début des données est 6, sinon c'est 6.
Voici un exemple avec lequel vous pouvez commencer
For( i = 1, i <= N Items( namefiles ), i++,
//Transformation du fichier en table de données
dt = Open(
namefiles[i],
Worksheets( "BOM" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 6 ),
Headers Start on Row( 1 ),
Data Starts on Row( 7 ),
Data Starts on Column( 1 ),
Data Ends on Row( 7 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
If( Is Missing( Num( Word( -1, Column( 1 )[1] ) ) ) == 0,
whatStartRow = 7;
whatHeaderStartRow = 6;
,
whatStartRow = 6;
whatHeaderStartRow = 5;
);
Close( dt, nosave );
dt = Open(
namefiles[i],
Worksheets( "BOM" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( whatHeaderStartRow ),
Data Starts on Row( whatStartRow ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
);