Acepte una lista de nombres de tabla y nombre de columna en scala y devuelva el prefijo agregado en los valores de columna
Aug 21 2020
Quiero recibir información del usuario en el siguiente formulario. Puede haber un n
número de table_name
y column_name
en esta cadena.
Estructura de entrada:
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"
Ejemplo real:
input="customer:name|customer_tmp:name,customer:period|account:period,customer:id|balance:balance_id"
Lógica que quiero implementar:
- Para table_name,
customer_tmp
agregue el sufijopm_
delante de la columna (nombre en el ejemplo). - Para table_name,
account
agregue el sufijoacct_
delante de la columna (punto en el ejemplo). - Para table_name,
balance
agregue el sufijobal_
delante de la columna (balance_id en el ejemplo).
Salida deseada para el ejemplo de entrada:
return_value="name|pm_name,period|acct_period,id|bal_balance_id"
¿Cómo se puede hacer que este código sea lo más genérico posible?
Respuestas
Shaido Aug 21 2020 at 10:00
Una posible solución sería dividir primero la cadena de entrada en una lista de tuplas:
val split_input = input.split(",")
.map(_.split("\\|").map(_.split(":")))
.map(v => (v(1)(0), v(0)(1), v(1)(1)))
Imprimir con foreach(println)
da:
(customer_tmp,name,name)
(account,period,period)
(balance,id,balance_id)
A continuación, mantenemos la lógica deseada en un Map
para permitir una fácil modificación:
val prefix_logic = Map("customer_tmp" -> "pm_", "account" -> "acct_", "balance" -> "bal_")
Ahora, podemos aplicar la lógica y crear la cadena final:
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(",")
Resultado:
name|pm_name,period|acct_period,id|bal_balance_id