FileMakerでフィールド内のひらがな・カタカナを判定する・カウントする

#概要

[FileMakerでフィールド内の漢字を判定する・漢字をカウントする](https://qiita.com/mizuho_wakamatsu/items/9e9e81aa5adff97e6eed)
のおまけです．こちらは簡単なのでさらっとやります．

日本語を取り扱ううえで外せないのが「ひらがな」「カタカナ」です．FileMakerにはHiragana関数，Katakana関数がありますが，これらはひらがな←→カタカナの相互変換を意図したもので，文字コードとして判定したり，カウントしたりすることはできません．その部分を補うものです．
（計算フィールド編は省略します．カスタム関数を参考に，引数Textを，テキストフィールドに置き換えて使用して下さい．）

##ひらがな判定の部
説明：テキストの中にひらがなが1つでも含まれていれば1を，そうでなければ0を返します．

####ひらがな判定のカスタム関数　While関数版（FileMaker18以降）
文字列の長さに制限があり，約5万字までです．

<details><summary>**While関数版のカスタム関数：ContainsHiragana(Text)**</summary><div>

```
Let ( [
	txt = Text ;
	len = Length(txt)
	] ; 
		While ( 
				[ i = 1 ; flg = 0 ] ;								//初期変数
					 i   ≤  len  and flg = 0 ;					//条件．最後の文字まで行くか，またはひらがなが1文字でも見つかれば終了
								[
								tp = Middle( txt ; i ; 1);
								code = Code(tp) ;
								flg = flg or Case(
													( code ≥ 12353 and code ≤ 12438)
														; 1 ; 0) ; 
								i = i + 1
				] ;												//ロジック
			flg												//結果
			)
     )

```
</div>

</details>

####ひらがな判定のカスタム関数　Let関数版（FileMaker17までの場合）
文字列の長さに制限があり，約294字までです．

<details><summary>**Let関数版のカスタム関数：ContainsHiragana(Text)**</summary><div>

```

Let([
		txt = Text;
		len = Length(txt);
		pos = 0;
		tp = Middle(txt;pos;1);
		code = Code(tp);
		i = 0;
		res = "";
		fnc ="																/*fnc開始*/
			 Case( pos > len or res = 1 ; res;							/*Case文開始．終了条件：最後の文字まで行くか，またはひらがなが1文字でも見つかれば終了*/
					Let([													/*内側のLet開始*/
						pos = pos + 1;
						tp = Middle( txt ; pos ; 1);						/*pos番目の文字を取得*/
						code = Code(tp);   								/*pos番目の文字のコードを取得*/
						res = If ( code ≥ 12353 and code ≤ 12438
						; 1 ; 0 )											/*コード判定*/ 
						]; 
						Evaluate(fnc))										/*内側のLet終了，内側のfnc計算*/
					)														/*Case文終了*/
			"																/*fnc終了*/
	];
		Evaluate(fnc)
																			/*外側のfnc計算*/
)																			/*外側のLet終了*/

```
</div>

</details>


##ひらがなカウントの部
説明：テキストフィールド中のひらがなの数を返します．

####ひらがなカウントのカスタム関数　While関数版（FileMaker18以降）
文字列の長さに制限があり，約5万字までです．

<details><summary>**While関数版のカスタム関数：CountHiragana(Text)**</summary><div>

```
Let ( [
		txt = Text ;
		len = Length(txt) ;
		num = 0 
		] ; 
		While ( 
				[ i = 1 ] ;									//初期変数
					 i   ≤  len ;							//条件
								[ 
								tp = Middle(txt ; i ; 1);
								code = Code(tp);
								i = i + 1 ;
								num = num + If ( 
												 ( code ≥ 12353 and code ≤ 12438)
												; 1 ; 0 )
								] ;							//ロジック
				 num 										//結果
				)
 )
```


</div>

</details>



####ひらがなカウントのカスタム関数　Let関数版（FileMaker17までの場合）
文字列の長さに制限があり，約294字までです．

<details><summary>**Let関数版のカスタム関数：CountHiragana(Text)**</summary><div>

```

Let([
	txt=Text;
	num = 0 ;															/*ひらがなの個数*/
	fnc="Case ( IsEmpty ( txt ) ; num ;								/*fnc開始．終了条件：最後の文字まで判定したらnumを返す*/
				Let([													/*内側のLet開始*/
					tp = left ( txt ; 1) ;
					code = Code ( tp ) ;
					num = num + ( code ≥ 12353 and code ≤ 12438 ) ;
					txt = right ( txt ; length ( txt ) - 1)
					]; Evaluate ( fnc ) 								/*内側のfnc終了*/
					)
				)"
	];
	Evaluate(fnc)														/*外側のfnc計算*/
	)

```


</div>

</details>


##カタカナ判定の部
説明：テキストの中にカタカナが1つでも含まれていれば1を，そうでなければ0を返します．

####カタカナ判定のカスタム関数　While関数版（FileMaker18以降）
文字列の長さに制限があり，約5万字までです．

<details><summary>**While関数版のカスタム関数：ContainsKatakana(Text)**</summary><div>

```
Let ( [
		txt = Text ;
		len = Length(txt)
		] ; 
			While ( 
					[ i = 1 ; flg = 0 ] ;								//初期変数
						i ≤ len  and flg = 0 ;						//終了条件：最後の文字まで行くか，またはカタカナが1文字でも見つかれば終了
								[
								tp = Middle( txt ; i ; 1);
								code = Code( tp ) ;
								flg = flg or Case(
													( code ≥ 12448 and code ≤ 12543)
													; 1 ; 0) ; 
								i = i + 1
								] ;										//ロジック
			flg														//結果
			)
     )

```


</div>

</details>


####カタカナ判定のカスタム関数　Let関数版（FileMaker17までの場合）
文字列の長さに制限があり，約294字までです．


<details><summary>**Let関数版のカスタム関数：ContainsKatakana(Text)**</summary><div>

```
Let([
		txt = Text ;
		len = Length(txt);
		pos = 0;
		tp = Middle(txt;pos;1);
		code = Code(tp);
		i = 0;
		res = "";
		fnc ="																/*fnc開始*/
			 Case( pos > len or res = 1 ; res;							/*Case文開始．終了条件：最後の文字まで行くか，またはカタカナが1文字でも見つかれば終了*/
					Let([													/*内側のLet開始*/
						pos = pos + 1;
						tp = Middle( txt ; pos ; 1);						/*pos番目の文字を取得*/
						code = Code(tp);   								/*pos番目の文字のコードを取得*/
						res = If ( code ≥ 12448 and code ≤ 12543
						; 1 ; 0 )											/*コード判定*/ 
						]; 
						Evaluate(fnc))										/*内側のLet終了，内側のfnc計算*/
					)														/*Case文終了*/
			"																/*fnc終了*/
	];
		Evaluate(fnc)
																			/*外側のfnc計算*/
)																			/*外側のLet終了*/

```


</div>

</details>


##カタカナカウントの部
説明：テキストフィールド中のカタカナの数を返します．

####カタカナカウントのカスタム関数　While関数版（FileMaker18以降）
文字列の長さに制限があり，約5万字までです．

<details><summary>**While関数版のカスタム関数：CountKatakana(Text)**</summary><div>

```
Let ( [
		txt=Text ;
		len=Length(txt) ;
		num = 0 

		] ; 
		While ( 
				[ i = 1 ] ;									//初期変数
					 i   ≤  len ;							//条件
								[ 
								tp = Middle(txt ; i ; 1);
								code = Code(tp);
								i = i + 1 ;
								num = num +If ( 
												 ( code ≥ 12448 and code ≤ 12543 )
												; 1 ; 0 )
								] ;							//ロジック
				 num 										//結果
				)
	)

```


</div>

</details>

####カタカナカウントのカスタム関数　Let関数版（FileMaker17までの場合）
文字列の長さに制限があり，約294字までです．

<details><summary>**Let関数版のカスタム関数：CountKatakana(Text)**</summary><div>

```

Let([
	txt=Text;
	num = 0 ;															/*カタカナの個数*/
	fnc="Case ( IsEmpty ( txt ) ; num ;								/*fnc開始．終了条件：最後の文字まで判定したらnumを返す*/
				Let([													/*内側のLet開始*/
					tp = left ( txt ; 1) ;
					code = Code ( tp ) ;
					num = num + ( code ≥ 12448 and code ≤ 12543 ) ;
					txt = right ( txt ; length ( txt ) - 1)
					]; Evaluate ( fnc ) 								/*内側のfnc終了*/
					)
				)"
	];
	Evaluate(fnc)														/*外側のfnc計算*/
	)

```


</div>

</details>

# 解説
ひらがなとみなしているのは，全角ひらがなだけです．
ひらがな＝【ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん】

文字コードの範囲は16進数で，3041から，309Fまでをひらがなとしています．
「・」　（中黒，中点）や，「ー」（音引き，長音）はひらがなではなくカタカナとして分類している点に注意して下さい．例：CountHiragana("あーあ")=2，となります．


カタカナとみなしているのは，全角のカタカナだけです．
カタカナ＝【゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ】
文字コードの範囲は16進数で，30A0から，30FFまでをカタカナとしています．
以下の文字を含んでいる点に注意して下さい．

30FB	・　中黒，中点
30FC	ー　音引き，長音
30FD	ヽ片仮名繰返し記号
30FE	ヾ片仮名繰返し記号（濁点）
30FF	ヿ（こと）

この辺りも，「どこまでをひらがな・カタカナとみなすか」は意見の分かれるところでしょうが，あくまでUnicodeのブロック名で分けています．適宜，計算式の部分を変更して使って下さい．

漢字・ひらがな・カタカナを使いこなして、楽しいFileMakerライフを！