Accetta un elenco di nomi di tabelle e nomi di colonne in scala e restituisce il prefisso aggiunto ai valori di colonna
Aug 21 2020
Voglio ricevere input dall'utente nel modulo sottostante. Può esserci un n
numero di table_name
e column_name
in questa stringa.
Struttura di input:
input="tablename_1:column_name|tablename_2:column_name,tablename_1:column_name|tablename_2:column_name,tablename_1:column_name|tablename_3:column_name"
Esempio reale:
input="customer:name|customer_tmp:name,customer:period|account:period,customer:id|balance:balance_id"
Logica che voglio implementare:
- Per table_name
customer_tmp
aggiungere il suffissopm_
davanti alla colonna (nome nell'esempio). - Per table_name
account
aggiungere il suffissoacct_
davanti alla colonna (punto nell'esempio). - Per table_name
balance
aggiungi il suffissobal_
davanti alla colonna (balance_id nell'esempio).
Output desiderato per l'esempio di input:
return_value="name|pm_name,period|acct_period,id|bal_balance_id"
Come può questo codice essere reso il più generico possibile?
Risposte
Shaido Aug 21 2020 at 10:00
Una possibile soluzione sarebbe prima dividere la stringa di input in un elenco di tuple:
val split_input = input.split(",")
.map(_.split("\\|").map(_.split(":")))
.map(v => (v(1)(0), v(0)(1), v(1)(1)))
La stampa con foreach(println)
dà:
(customer_tmp,name,name)
(account,period,period)
(balance,id,balance_id)
Successivamente manteniamo la logica desiderata in a Map
per consentire una facile modifica:
val prefix_logic = Map("customer_tmp" -> "pm_", "account" -> "acct_", "balance" -> "bal_")
Ora possiamo applicare la logica e creare la stringa finale:
val split_output = split_input.map(v => (v._2, prefix_logic.get(v._1).get + v._3))
val return_value = split_output.map(v => v._1 + "|" + v._2).mkString(",")
Risultato:
name|pm_name,period|acct_period,id|bal_balance_id