Prego 
la mia domanda è: posso inserire più sopra lo split in modo da ricavare ProgrammaNome, ProgrammaUrl e classeCella (Topolino nel primo split) in modo da usarli successivamente nell'assegnazione della classe CSS al <td> prima e poi nela costruzione del link ivi contenuto?
In altre parole... i due split fanno la stessa cosa; posso farne uno solo?
Sì, puoi fare un unico split ma dovresti cercare di capire meglio come poter impostare il tutto.
Ti spiego...
Si può comunque intervenire in svariati modi ma, se vuoi sfruttare i metodi forniti dalla libreria D3 in questione, devi tenere conto delle caratteristiche di funzionamento di tali metodi.
Considera che sia il metodo attr() sia il metodo html() di D3 (e, in linea di massima, tutti gli altri metodi, di tale libreria, per la manipolazione degli elementi DOM) sono applicabili ad una "selezione D3". Se per questi metodi viene impostata una funzione di callback (esattamente come nel tuo script), questa funzione viene valutata per ciascun elemento DOM della relativa selezione.
Considera inoltre che associando, alla selezione, un array di dati (ad es. col metodo data(), come nel tuo caso), ogni singolo dato viene passato alla funzione di callback in ordine di corrispondenza con gli elementi della selezione stessa. In altre parole, per ogni elemento della selezione viene valutata la funzione di callback a cui viene passato (come primo argomento) il corrispondente dato prelevato dall'array di dati associati.
Quando chiedi "posso inserire più sopra lo split... ?", bisognerebbe capire cosa intendi per "più sopra". Se vuoi eseguire lo split fuori da quelle funzioni di callback (quelle definite per attr() e html()) , non puoi ottenere il dato relativo alla specifica cella, perché questo lo ottieni passando proprio attraverso a tali funzioni, le quali vengono eseguite per ogni cella.
Detto questo, un modo semplice per recuperare il dato corrispondente ad un elemento della selezione è quello di leggerlo, appunto, attraverso l'argomento della relativa funzione di callback che può essere definita per i metodi in questione; cioè, il dato è più semplice leggerlo quando si è all'interno di una di quelle funzioni.
Per semplificare i passaggi ed eliminare quindi uno split, potresti integrare, all'interno di uno di quei metodi, l'azione dell'altro metodo.
Ad esempio, potresti rimuovere il metodo attr() che assegna la classe, e usare uno script che faccia comunque la stessa azione, scrivendolo però all'interno della funzione usata per il metodo html(). In questo modo avresti una sola funzione di callback dove ci sarà un unico split attraverso il quale potrai eseguire le varie azioni.
Qui un esempio:
codice:
d3.csv("Palinsesto.csv", function (datiCaricati) {
var d = datiCaricati;
d3.select("tbody")
.append("tr")
.selectAll("td")
.data([d.dalle, d.alle, d.LUNEDI, d.dalle, d.alle, d.MARTEDI, d.dalle, d.alle, d.MERCOLEDI,
d.dalle, d.alle, d.GIOVEDI, d.dalle, d.alle, d.VENERDI, d.dalle, d.alle, d.SABATO,
d.dalle, d.alle, d.DOMENICA])
.enter()
.append("td")
.html(function(dato){
const [ProgrammaNome, ProgrammaUrl, classeCella] = dato.split("|");
// Aggiungo la classe (usando i metodi D3)
if (classeCella) d3.select(this).classed(classeCella, true);
// oppure con vanilla JavaScript ES6
//if (classeCella) this.classList.add(classeCella);
/* se la cella ha il valore dell'url, inserisco un link */
if (ProgrammaUrl) {
return "<a href='" + ProgrammaUrl + "' target='blank' \">" + ProgrammaNome + "</a>"
}
/* altrimenti mostro un testo normale */
/*Se non ci fosse le colonne "dalle" e "alle" non verrebbero visualizzate */
else {
return ProgrammaNome
}
});
});
Da notare l'uso del this che fa riferimento all'elemento (td) corrente a cui vado ad applicare la classe. All'interno del callback di questi metodi infatti il contesto (cioè il valore di this) è riferito all'elemento corrente per il quale viene valutata la funzione.
Questa può essere una soluzione ma, ripeto, si può fare in tanti altri modi. Suppongo comunque che la cosa più importante per te, sia comprendere al meglio i meccanismi di funzionamento, sia quelli specifici per la libreria D3 usata per il tuo elaborato, sia quelli relativi a JavaScript in modo più generale... poi tutto il resto viene di conseguenza.