Ciao a tutti,
Sto cercando di manipolare i nomi delle mie colonne. È molto facile da fare una o due volte con Trova/Sostituisci, ma mi piacerebbe scriverlo.
In sostanza, voglio cambiare il nome di una colonna da "Singlets/Live leukocytes/Lymphocytes/B cells/A+B+C-,Freq. of Parent" a " Cellule B/A+B+C-,Freq. di Genitore".
Ecco il mio codice attuale:
dt = Current Data Table ();
colList = dt << get column names(string);
For ( i = 1, i <= N Items(colList), i++,
If (
contains(colList[i], "Singlets/Live leukocytes/Lymphocytes/"), <BR />
Column(dt, colList[i]) << set name (Word(2, colList[i], "Lymphocytes/"))
));
Se eseguo parti di questo codice singolarmente, ecco cosa ottengo:
riga di codice:
risultato nel registro dello script
colList[i]:
"Singlets/Live leukocytes/Lymphocytes/B cells/A+B+C-,Freq. of Parent"
contains(colList[i], "Singlets/Live leukocytes/Lymphocytes/"):
1
Word(2, colList[i], "Lymphocytes/"):
"iv"
Word(3, colList[i], "Lymphocytes/"):
" l"
Word(4, colList[i], "Lymphocytes/"):
"uk"
Word(9, colList[i], "Lymphocytes/"):
"f Par"
Chiaramente, il mio delimitatore non funziona come mi aspetto. Qualche idea?
Inizialmente ho provato a fare Words(4, colList[i], "/") ma questo mi ha dato solo "celle B" poiché c'è un altro / subito dopo. A differenza di altri linguaggi di programmazione, non so se esiste un modo per specificare "la 4a parola e poi tutto fino alla fine" in JSL. Non penso che sia possibile, quindi ho cambiato il delimitatore, pensando che avrebbe risolto il mio problema.
Grazie mille per qualsiasi consiglio!!
OH! Ok, anche questo rende MOLTO più sensato uno degli esempi nella guida allo scripting!!
Ho finito per usare substr a mio vantaggio! Pubblicherò il codice dopo pranzo!
Una confusione è che l'argomento delimitatore della funzione WORDS significa dividere questo testo se trovi QUALSIASI di questi caratteri.
Questo approccio può avvicinarti a ciò che desideri:
collist = {};
collist[1] = "Singlets/Live leukocytes/Lymphocytes/B cells/A+B+C-,Freq. of Parent";
collist[2] = "Singlets/Live leukocytes/Lymphocytes/Another Text";
collist[3] = "Singlets/Live leukocytes/Lymphocytes/Hello World";
remove_text = "Singlets/Live leukocytes/Lymphocytes/";
len_text = length(remove_text);
for (i = 1, i <= nitems(collist), i++,
start_pos = contains(colList[i], remove_text);
if (start_pos,
end_pos = start_pos + len_text;
new_name = substr(collist[i], end_pos);
show(new_name);
Column(dt, colList[i]) << set name (new_name);
);
);
Il delimitatore è un carattere, non una stringa di caratteri.
Potresti anche trovare utili espressioni regolari in questo problema.
Usa N Items( list ) per determinare quanti livelli esistono e prendi quelli dalla fine.
Inoltre, sai perché il codice originale non funziona?
Cosa succede se ho un numero diverso di elementi dell'elenco? Questo sarebbe list[4]||" "||list[5] ma se ho 6 elementi nella mia lista e voglio che vada alla fine...
Sto cercando di pseudocodificare alcuni cicli for che vanno su N elementi ma non l'ho ancora ottenuto.
Vedere Guida > Indice di scripting > Funzioni > Carattere > Parole
Usa "/" come delimitatore. Inoltre, usa invece la funzione Words(). Otterrai un elenco. È quindi possibile concatenare gli elementi dell'elenco. In questo caso la nuova stringa sarà list[5] || elenco[5].
Abbastanza facile, eh?