よくやりたい処理として、DBの定義書のカラム名(スネークケース)からキャメルケースの作成があります。
例えばJavaのPojoを作成したい場合などです。
パッと検索を行ったところ、qiitaで実際に関数を作成してくれている人がいました。この処理は完璧だと思います。
さすがqiitaだぜ!!
https://qiita.com/khayashi4337/items/c2d51387e44b922d4e46
これで全く問題もないのですが、別解もあるかなあと思ったので記載してみたいと思います。
スネークケースとキャメルケース
正直、スネークケースとキャメルケースについて細かいルールを把握しているわけではないので、ついでに勉強をしてみました。
スネークケースのルール
- アンダースコア(_)を区切記号として単語をつなげる。
- アンダースコアは連続させない
- すべて小文字
(例)very_good
キャメルケース
- 先頭は小文字(大文字なのはパスカルケース)
- 大文字が連続した場合は区切り文字ではない
(例)veryGood
大した内容ではないですが、要はキャメル→スネークに変換する場合、大文字が連続していた時は区切り文字として判断させない必要があります。
今回使用するもの
キャメルケースへの変換について1文字ずつ調べていくのが最初に思いつくところです。
しかし、全く別の調べ物をしていた時に、PROPERという関数を見つけました。
UPPER、LOWERは知っていたが、正直コレは知らなかった。
英字文字列の単語の先頭の文字、および記号の次の文字を大文字に変換します。 それ以外の英字はすべて小文字にします。
https://support.office.com/ja-jp/article/proper-%E9%96%A2%E6%95%B0-52a5a283-e8b2-49be-8506-b2887b889f94
スネークケース→キャメルケースの変換
Function SnakeToCamel(ByVal val) As String
Dim sp As Variant
Dim i As Integer
If val = "" Then Exit Function
sp = Split(val, "_")
SnakeToCamel = WorksheetFunction.Proper(sp(0))
For i = 1 To UBound(sp)
SnakeToCamel = SnakeToCamel & WorksheetFunction.Proper(sp(i))
Next
SnakeToCamel = LCase(Left(SnakeToCamel, 1)) & Mid(SnakeToCamel, 2, Len((SnakeToCamel)))
End Function

かなりスマートに書けた気がする。
Evaluateとかの挙動で変になることが多いので、Excel関数系の呼び出しは個人的に抵抗があったが、書きやすいところは関数で書いていくことにしよう。
キャメルケース→スネークケースの変換
こちらはいい案が思いつかなかったので泥臭くやっています。
Function CamelToSnake(ByVal val) As String
Dim i As Integer
Dim komoji As String
komoji = LCase(val)
For i = 1 To Len(komoji)
If Mid(val, i, 1) = Mid(komoji, i, 1) Then
CamelToSnake = CamelToSnake & Mid(komoji, i, 1)
ElseIf Mid(val, i - 1, 1) = Mid(komoji, i - 1, 1) Then
CamelToSnake = CamelToSnake & "_" & Mid(komoji, i, 1)
Else
CamelToSnake = CamelToSnake & Mid(komoji, i, 1)
End If
Next
End Function

いきなり全部小文字にした後、for文を2文字目から回していき、大文字であったらif文がfalseになるのでハイフンを付与しています。
ただし、1文字前も一致したら大文字の連続なのでハイフンを付けない形にしています。
正規表現でsplit出来ないかなあとか考えていたのですが、そんな事すると余計難しいわってなりそうだったので…。
コメントを残す