Gestione di due diversi formati di intestazione ExcelCiao a tutti,
Sto lavorando a uno script JSL in JMP per automatizzare l'importazione di file Excel BOM (Bill of Materials). Questi file provengono da fonti diverse e purtroppo non seguono un formato uniforme.
Ho a che fare con due formati specifici:
- Formato 1: le intestazioni sono sulla riga 5, i dati iniziano sulla riga 6
- Formato 2: le intestazioni sono sulla riga 6, i dati iniziano sulla riga 7
Al momento, il mio script è codificato per utilizzare il Formato 1 (le intestazioni iniziano sulla riga (5)), ma devo modificarlo manualmente ogni volta che ricevo file in Formato 2.
Obiettivo: vorrei che lo script fosse sufficientemente intelligente da rilevare automaticamente il formato corretto e applicare le impostazioni di importazione appropriate (le intestazioni iniziano sulla riga, i dati iniziano sulla riga), senza intervento manuale.
Ecco un estratto dello script attuale:
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 />...
Qualcuno ha riscontrato un problema simile? Sto cercando:
- Un modo per ispezionare le prime righe del file Excel (magari utilizzando un'importazione temporanea) per dedurre dove inizia effettivamente l'intestazione. Ad esempio, controllando i nomi di colonna noti.
- Oppure qualsiasi tecnica JSL per gestire questo tipo di variabilità in modo più flessibile.
Automazione e scriptingCombinazione e pulizia dei datiIngegneria della qualità e dei processiFinestreRe: Gestione di due diversi formati di intestazione ExcelPotresti fornire un esempio di ciascuno dei 2 file formattati? Questo aiuterebbe molto a determinare l'approccio da adottare. In pratica, quello che faccio di solito è leggere le prime 7 righe come se fossero un'unica colonna. Poi analizzo la tabella per determinare il formato e poi leggo l'intera tabella utilizzando il formato determinato.
Re: Gestione di due diversi formati di intestazione ExcelGrazie mille per la risposta.
Allego i due campioni, uno per ogni formato.
Cercherò di implementare quanto hai suggerito per vedere se riesco a leggere correttamente le prime 7 righe come una singola colonna e quindi analizzare la tabella per determinarne il formato e leggere la tabella completa utilizzando il formato determinato.
Apprezzo davvero il tuo aiuto!
Re: Gestione di due diversi formati di intestazione ExcelIl suggerimento di Jim è un'ottima opzione, un'altra opzione sarebbe quella di acquisire più dati e quindi eseguire la pulizia in 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: Gestione di due diversi formati di intestazione ExcelNei fogli di calcolo, se il nome della prima colonna letta utilizzando intestazioni di lunghezza 6 contiene un numero valido, la riga di inizio dati è 6, altrimenti è 6.
Ecco un esempio da cui puoi iniziare
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( "-" )
)
);
);