Scalaでテーブル名と列名のリストを受け入れ、列の値に追加されたプレフィックスを返します

Aug 21 2020

以下のフォームでユーザーからの入力を受け取りたいです。この文字列にntable_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