Analizza la stringa di una colonna e riempi un'altra colonnaCiao,
Ho una tabella contenente ProductName e voglio generare la colonna OUTPUT.La colonna OUTPUT è una concatenazione di ProductID con Serial#. Come analizzo accuratamente il Serial# e creo la colonna OUTPUT?
# esempi di serie:
- 07-08_13 significa numero di serie 07, 08, 13
- 09-12 significa Seriale # 09, 10, 11, 12
- 01-03_05-08 significa numero di serie 01, 02, 03, 05, 06, 07, 08
- 01_04_05-08 significa numero di serie 01, 04, 05, 06, 07, 08
- 09_11_13_14 significa numero di serie 09,11,13,14

| Nome del prodotto | PRODUZIONE |
| AABBCC_07-08_13 | AABBCC-07 |
| AABBCC_07-08_13 | AABBCC-08 |
| AABBCC_07-08_13 | AABBCC-13 |
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
| EEFFGG_02 | EEFFGG-02 |
| HHIIJJ_01-07 | HHIIJJ-01 |
| HHIIJJ_01-07 | HHIIJJ-02 |
| HHIIJJ_01-07 | HHIIJJ-03 |
| HHIIJJ_01-07 | HHIIJJ-04 |
| HHIIJJ_01-07 | HHIIJJ-05 |
| HHIIJJ_01-07 | HHIIJJ-06 |
| HHIIJJ_01-07 | HHIIJJ-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-01 |
| KKLLLMM_01-03_05-08 | KKLLLMM-02 |
| KKLLLMM_01-03_05-08 | KKLLLMM-03 |
| KKLLLMM_01-03_05-08 | KKLLLMM-05 |
| KKLLLMM_01-03_05-08 | KKLLLMM-06 |
| KKLLLMM_01-03_05-08 | KKLLLMM-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-08 |
| NNOOPP_01_04_05-08 | NNOOPP-01 |
| NNOOPP_01_04_05-08 | NNOOPP-04 |
| NNOOPP_01_04_05-08 | NNOOPP-05 |
| NNOOPP_01_04_05-08 | NNOOPP-06 |
| NNOOPP_01_04_05-08 | NNOOPP-07 |
| NNOOPP_01_04_05-08 | NNOOPP-08 |
| QQRRSS_09_11_13_14 | QQRRSS_09 |
| QQRRSS_09_11_13_14 | QQRRSS_11 |
| QQRRSS_09_11_13_14 | QQRRSS_13 |
| QQRRSS_09_11_13_14 | QQRRSS_14 |
Tabella datiScriptingRe: Analizzare la stringa di una colonna e riempire un'altra colonnaMolto probabilmente potresti scrivere una formula con Lag per farlo (o uno script con JSL), ma puoi anche provare a farlo in modo interattivo ma ci vogliono alcuni passaggi:
1. Seleziona la colonna ProductName
2. Vai alle colonne Cols/Utilities/Text To e usa sia - che _ come delimitatori

3. Vai a Tabelle e impila e aggiungi tutto il resto oltre alla prima colonna per la selezione delle colonne impilate


5. Rimuovi colonna etichetta
6. Seleziona entrambe le colonne rimaste e vai su Righe / Selezione riga / Seleziona righe duplicate ed elimina quelle righe

7. Seleziona una cella con un valore vuoto e scegli Seleziona celle corrispondenti ed elimina quelle righe
8. Ora scegli entrambe le colonne e fai clic con il pulsante destro del mouse sull'intestazione della colonna e crea la formula

9. Apri la formula appena creata e cambia , in _

10. Rinominare ed eliminare colonne/formule
11. Se hai bisogno di avere ProductName lì, dovresti essere in grado di tenerlo lì se non lo elimini accidentalmente nel primo passaggio come ho fatto io

Se devi avere - o _ a seconda del numero di serie, molto probabilmente potresti gestirlo nella formula di concatenazione
Modifica: ho controllato la domanda in modo un po' più accurato e questo è un po' più complicato di quello che ho mostrato qui. Dovrai aggiungere calcoli per alcuni dei numeri di serie perché sono tra i numeri. Questa soluzione non funzionerà in quelli perché alcune righe verranno rimosse quando vengono rimossi i duplicati.
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaCiao @cchueng ,
Ci sono un paio di modi. Alcuni sono script di base (cerca una risposta da qualcuno che suggerisce questo con un esempio) oppure potresti usare cicli successivi di Text to Columns (esempio trovato qui Risolto: come posso dividere il testo in una colonna in più colonne? - Comunità di utenti JMP) Quindi puoi concatenare le colonne desiderate selezionandole e quindi utilizzare una formula di colonna o utilizzare l'opzione Nuova colonna formula dopo aver fatto clic con il pulsante destro del mouse su una delle colonne selezionate. Cerca le opzioni Carattere per concat.La formula della colonna è più flessibile e offre molte opzioni vedere l'aiuto su questo argomento ( Crea formule in JMP )
Spero che ti dia una direzione.
Migliore,
Re: Analizzare la stringa di una colonna e riempire un'altra colonna@jthi ,
Mi hai battuto sul tempo.
La tua spiegazione è più dettagliata e anche quello a cui stavo pensando.
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaHai ragione. il - viene interpretato come un intervallo e il _ viene interpretato come un vero delimitatore di elementi
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaGrazie ma preferisco un jsl piuttosto che il delimitatore interattivo. Il tuo metodo non ha affrontato lo scenario quando il numero di serie 09-12. Dovrebbe produrre righe come di seguito. Non solo AABBCC-09 e AABBCC-12. Il "-" significa "a" che significa intervallo. Quindi 09-12 significa 09, 10, 11, 12.
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaOk, questo potrebbe funzionare. Richiede JMP16 a causa dell'utilizzo di For Each (può essere sostituito con For per altre versioni. Questa è una soluzione pesantemente scritta, con pochi o nessun commento e richiederà una tabella di partenza specifica per funzionare (richiede la colonna OUTPUT).
Names Default To Here(1);
dt = New Table("Untitled 4993",
Add Rows(32),
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
),
New Column("OUTPUT",
Character(16),
"Nominal",
Set Values({"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""})
)
);
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd,
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges,
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
dt[0,"OUTPUT"] = valList;Mi chiedo se qualcosa del genere possa essere fatto "facilmente" con il pattern matching di JMP @Craige_Hales
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaCiao chris,
Ho uno script che affronterà alcuni dei ProductName e talvolta analizzerà in modo errato. Puoi rivedere e aggiungere codici per indirizzare quei ProductName che non funzionano finora?
Funzionerà per gli esempi seguenti:
EEFFGG_02
HHIIJJ_01-07
KKLLLMM_01-03_05-08
Non funzionerà ancora per gli esempi seguenti:
AABBCC_07-08_13
NNOOPP_01_04_05-08
QQRRSS_09_11_13_14
dt=current data table();
(dt << New Column( "ProductID", Character )) << Set Selected;
(dt << New Column( "OUTPUT", Character )) << Set Selected;
//Parse string in ProductName column
For Each Row(
dt,
//Assign the ProductID value
:ProductID = Word( 1, :ProductName, "_-" ); //"_"
//If the ProductName changes, capture the start and end
If( :ProductName != Lag( :ProductName, 1 ),
start = Num( Word( 2, :ProductName, "_-" ) );
end = Num( Word( 3, :ProductName, "_-" ) );
);
//Assign the OUTPUT value
:OUTPUT = :ProductID || "-" || Repeat( "0", 2 - Length( Char( start ) ) ) || Char( start );
//After end value & there is an _, set start to value after _
If( start == end & Contains( :ProductName, "_"),
start = Num( Word(-2, :ProductName, "_-" ) ),
start++);
);
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaciao jthi,
Grazie per lo script, ma la mia tabella è in realtà dinamica. Ogni giorno, estrarrò questa tabella da un database con un intervallo di date diverso e appariranno diversi set di ProductName. Quindi non sono sempre 32 righe. Il tuo script può quasi funzionare, ma puoi indirizzare la dimensione dell'array? Grazie.
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaDovrebbe essere abbastanza facile. Hai tante righe nei dati estratti quanti sono i numeri di serie?
Re: Analizzare la stringa di una colonna e riempire un'altra colonnaciao jthi,
Sì, il numero di righe corrispondeva al numero di numeri di serie.
Re: Analizza la stringa di una colonna e riempi un'altra colonnaIn tal caso, dovrebbe già essere in grado di gestirlo. Ho apportato piccole modifiche (creazione della colonna OUTPUT se manca). Attualmente si basa sul fatto che la tabella dati è ordinata per ProductNames, il che potrebbe causare problemi a un certo punto, oppure è possibile assicurarsi che la tabella di input sia ordinata (soluzione più semplice).
Dovresti essere in grado di utilizzare la parte For Each può essere utilizzata anche senza datatable purché tu abbia una variabile di elenco denominata uniqProd che ha ProductNames. Dopodiché si tratta solo di capire come aggiungere valori a datatable.
Names Default To Here(1);
//Test table
/*
dt = New Table("Untitled 4993",
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
)
);
*/
dt = Current Data Table();
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd, //loop for each ProductName
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges, //Loop for serialnumber inside the ProductName
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
//if starting table doesn't have OUTPUT column create it
If(!Contains(dt << Get Column Names("String"), "OUTPUT"),
dt << New Column("OUTPUT", Character, "Nominal");
);
//dt[0,"OUTPUT"] = valList; subscripting, maybe a bit more difficult to understand
dt:OUTPUT << Set Values(valList);
Versione semplificata cosa cercano di fare gli script:
1. Lo script ottiene tutti i valori univoci nella colonna ProductName
2. Lo script scorre su ciascuno di quelli in due parti per ogni ciclo
3. Il primo ciclo scorre i valori univoci e li divide in Prodotto e parti del numero
4. La parte del numero di serie viene quindi ripetuta in loop per dividerla in valori singoli. Questi singoli valori vengono concatenati con la parte Product e quindi la stringa viene inserita nell'elenco valList (questo 4. non è esattamente così semplice come ho spiegato qui).
5. Dopo che entrambi i cicli sono terminati, dovresti avere un elenco, che contiene tutti i possibili numeri di serie. La parte del prodotto sarà in ordine alfabetico.
6. Questo elenco viene quindi aggiunto a OUTPUT se esiste, in caso contrario viene prima creato.
Re: Analizza la stringa di una colonna e riempi un'altra colonnaCiao jthi,
Il tuo script non funzionerà se il mio ProductName è un misto di caratteri e numeri. Ho allegato un tavolo. Ecco come apparirà la maggior parte del mio productName. Grazie per avermi aiutato.