Scalaでテーブル名と列名のリストを受け入れ、列の値に追加されたプレフィックスを返します
Aug 21 2020
以下のフォームでユーザーからの入力を受け取りたいです。この文字列にn
はtable_name
、との数を含めることができcolumn_name
ます。
入力構造:
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"
実際の例:
input="customer:name|customer_tmp:name,customer:period|account:period,customer:id|balance:balance_id"
実装したいロジック:
- table_nameの場合、列の前に
customer_tmp
サフィックスpm_
を追加します(例ではname)。 - table_nameの場合、列の前に
account
サフィックスacct_
を追加します(例ではピリオド)。 - table_nameの場合、列の前に
balance
サフィックスbal_
を追加します(例ではbalance_id)。
入力例の必要な出力:
return_value="name|pm_name,period|acct_period,id|bal_balance_id"
このコードを可能な限り一般的にするにはどうすればよいですか?
回答
Shaido Aug 21 2020 at 10:00
考えられる解決策の1つは、最初に入力文字列をタプルのリストに分割することです。
val split_input = input.split(",")
.map(_.split("\\|").map(_.split(":")))
.map(v => (v(1)(0), v(0)(1), v(1)(1)))
で印刷するとforeach(println)
:
(customer_tmp,name,name)
(account,period,period)
(balance,id,balance_id)
次に、必要なロジックをに保持して、Map
簡単に変更できるようにします。
val prefix_logic = Map("customer_tmp" -> "pm_", "account" -> "acct_", "balance" -> "bal_")
これで、ロジックを適用して最終的な文字列を作成できます。
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(",")
結果:
name|pm_name,period|acct_period,id|bal_balance_id