Troncamento di stringhe di caratteri<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho più tabelle di dati che includono una colonna chiamata "Trovato nella versione".Le versioni principali sono generalmente di 4 cifre --- le versioni secondarie a volte aggiungono un carattere alfabetico alla fine di un numero di versione maggiore.Ai fini della rappresentazione grafica non voglio mostrare le versioni minori --- invece vorrei unire le versioni minori con le loro versioni principali associate.Per esempio...se una versione principale è 5.1.2.1, voglio che anche la versione secondaria 5.1.2.1a si chiami 5.1.2.1.....
per gettare un'altra piega nel mix ---- potrei anche voler convertire tutti i 5.1.2.x in 5.1.2 ---- quindi 5.1.2.0, 5.1.2.2a, 5.1.2.3, 5.1.2.4a , ecc... diventerebbe la versione 5.1.2
La colonna corrente è 'Carattere', 'Nominale'......Stavo pensando di "troncare" le stringhe di caratteri nella colonna a 7 caratteri o 5 a seconda del livello di dettaglio necessario/desiderato --- ma non sono sicuro di come farlo o se esiste un approccio migliore.
Inoltre --- sto ricevendo datatables da diversi team --- ognuno sembra avere uno schema di versioning diverso --- quindi la flessibilità dovrà essere incorporata ----- non sono sicuro di dover analizzare ogni dato elemento s e confronta i caratteri comuni per vedere se "appartengono" alla stessa versione ???

Ri: troncamento di stringhe di caratteriLe risposte qui sono state molto utili e mi hanno portato a pensare che potrei averlo reso troppo complicato --- quindi ho provato la funzione del personaggio "Sinistra" ma non sono riuscito a farlo funzionare la scorsa settimana ....la mia sintassi deve essere stata "disattivata" --- perché ha funzionato per me oggi ..
| Per ogni riga (: Trovato in Vers Troncato = Sinistra(:Trovato nella versione, 7)); |
---- questo tronca semplicemente la stringa di caratteri alla maggior parte dei caratteri a sinistra... che eliminerà i caratteri della versione minore ---poiché i numeri di versione dei vari team non sono coerenti (alcuni team usano 4 cifre con caratteri alfabetici aggiunti, alcuni usano 3 cifre senza caratteri alfabetici aggiunti) Penso che questo metodo possa funzionare ma dovrò testare quale schema di versione viene utilizzato per determinare il livello di troncamento....
Ri: troncamento di stringhe di caratteriPenso che un'espressione regolare (regex ()) possa risolvere il problema.
Newcolumn("Trovato nella versione maggiore",carattere,nominale,
formula(regex(:Trovato nella versione, ".*?(\d+\.\d+\.\d+).*","\1")
);
".*?(\d+\.\d+\.\d+).*" significa trovare quanto basta di qualsiasi cosa, .*?, seguito da un numero di qualsiasi lunghezza, \d+, decimale una volta, \., un numero di qualsiasi lunghezza, \d+, decimale una volta, \. , un numero di qualsiasi lunghezza, \d+, seguito da qualsiasi cosa. Restituisci solo la parte tra parentesi, i numeri e i decimali, \1.
Per la versione secondaria, modificare l'espressione regolare (regex()) per avere un decimale e un numero in più.
Newcolumn("Trovato nella versione minore",carattere,nominale,
formula(regex(:Trovato nella versione, ".*?(\d+\.\d+\.\d+\.\d+).*","\1")
);
Ri: troncamento di stringhe di caratteriD'altra parte, questa è l'arma nucleare di ETL, garantita per gestire tutto, ma più lavoro. Potresti scoprire che è l'unica opzione se i tuoi diversi fornitori seguono processi significativamente diversi.
Crea semplicemente una tabella di conformità univoca per ciascun fornitore:
i dati hanno;
lunghezza FoundInVersion $32;
input FoundInVersion $;
carte;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9strano
correre;
dati master_conversione;
lunghezza FoundInVersionGood FoundInVersion $32;
input FoundInVersionGood $ FoundInVersion $;
carte;
5.1.2 5.1.2.1
5.1.2 5.1.2.2
5.2.2 5.2.2.2a
5.2.2 5.2.2.3
5.2.2 5.2.2.3x
5.2.2 5.2.2.9
5.2.2 5.2.2.9strano
correre;
proc sql;
creare tabella desidera come
selezionare FoundInVersionGood come FoundInVersion
dall'unione interna master_conversion
have on (master_conversion.FoundInVersion = have.FoundInVersion);
esentato;
Tom
Ri: troncamento di stringhe di caratteriMi scuso per l'utilizzo del codice SAS, poiché non sono un utente JMP ... forse le funzioni equivalenti esistono in JMP?
Questo è molto semplice e molto stupido, quindi i dati devono essere abbastanza conformi:
i dati hanno;
lunghezza FoundInVersion $32;
input FoundInVersion $;
carte;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9strano
correre;
i dati vogliono;
lunghezza FoundInVersionGood $ 32;
impostare avere;
/* Usando il punto come delimitatore, cerca la prima, la seconda e la terza parola (SCAN), quindi le concatena con punti intermedi (CATX). */
/* assume che ci saranno sempre almeno tre livelli */
FoundInVersionGood = catx(".", scan(FoundInVersion,1,"."), scan(FoundInVersion,2,"."), scan(FoundInVersion,3,"."));
correre;
Tom
Ri: troncamento di stringhe di caratteriQuesto farà il trucco.Esegue il ciclo su tutti i valori e utilizza espressioni regolari per testare ogni valore.
dt = tabella dati corrente () ;
dt << nuova colonna ( "Trovato in Vers troncato" , carattere , nominale ) ;
per ( io = 1 , io <= nrow ( dt ) , io ++,
valore_test = colonna ( dt , "Trovato nella versione" )[ io ] ;
// Verifica se l'ultimo carattere è uno dalla a alla z
Se ( manca ( espressione regolare ( valore_test , "[z]$" )) ,
// Poi
colonna ( dt , "Trovato in Vers troncato" )[ io ] = valore_test ;
,
// altro
una_lunghezza = lunghezza ( valore_test ) ;
colonna ( dt , "Trovato in Vers troncato" )[ io ] = sost ( valore_test , 1 , ( una_lunghezza - 1 )) ;
) ;
) ;
Ri: troncamento di stringhe di caratteriCIAO,
Non sono sicuro se questo è quello che vuoi:
i dati hanno;
input old :$10.;
carte;
5.1.2
5.1.2.1
5.1.2.1e
;
i dati vogliono;
lunghezza nuovo $ 5;
impostare avere;
nuovo=vecchio;
correre;
proc stampa;esegui;
Haikuo