見出し画像

NDLサーチの考察 サブタイトルをどう扱うか

今回からは各項目の読み込みについて、実際に使ってみて気がついた細かいところを考察しながら、FileMakerで処理する方法を考えます。初回はサブタイトルの扱いについてです。

まずは仕様書

旧仕様ではタイトルとサブタイトルが別のタグに格納されていましたが、今年の仕様変更以来、区別されなくなったようです。特に問題は無いと言えばそうなのですが、表示が長くなりすぎることもあるのが気にはなります。
楽天booksや版元ドットコムではタイトルとサブタイトルは分けられています。
とにかく、仕様書を見てみます。

タイトルは<dcterms:title>タグ内のテキストと、<dc:title>タグ内のタイトルと読みのセットの2通りに格納されていますが、サブタイトルに関する項目は特に無いようです。いくつか例を見てみます。

これからの「正義」の話をしよう いまを生き延びるための政治哲学
URLは下記の通り。直リンクだとうまくいかない場合があるようなのでコードの形式にしてます。コピーしてブラウザで開いてみてください。

https://ndlsearch.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl&query=isbn=9784152091314

検索結果をキャプチャします。タイトルに関する部分をハイライトします。

小さなチーム、大きな仕事 37シグナルズ成功の法則

https://ndlsearch.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl&query=isbn=9784153200111

同じく検索結果です。

タイトルとサブタイトルの間に「:」の前後に半角スペースを入れて格納しているようです。例外はあるかもしれませんが、ひとまず「タイトルとサブタイトルは"_:_"(*_は半角スペース)で区切られている」とみなして良さそうです。

半角スペースもPosition関数で特定できる

「:」自体がタイトル自体にも使われることは珍しくもないので、サブタイトルの有無を判定するためには、前後の半角スペース含めて場所を特定してやる必要があります。スペースを含めた文字列を関数処理で拾えるのか、簡単に試してみます。

フィールドを2つ作成し、1つは入力できるテキストフィールド、もう1つはテキストフィールドの中から" : "の位置を返す計算フィールドです。

入力したテキストの13文字目に" : "があることが返りました。半角スペースを削除したり、全角にしても0が返されるので、半角スペースは無視されず、全角と区別されてカウントされることがわかりました。

サブタイトルを別のフィールドに格納する

サブタイトルの有無と位置を特定できるようになったので、サブタイトルのフィールドに格納できるようにします。サブタイトル自体はテキストから" : "以降を抜き出してやれば良いです。Right関数で取り出します。

Right ( テキスト ; Length ( テキスト ) - 位置 -2)

先のPosition関数で返されるのは、" : "のうちの最初の半角スペースの位置で、実際に取り出すのはその2文字後ろからです。取り出す文字数は全体の文字数から" : "の位置を引いて、さらに2文字引いた数になります。試してみます。

これでサブタイトルを格納することができました。

重複になるサブタイトル部分を削除する

サブタイトルを格納したので、元々のタイトルからサブタイトル部分を削除します。Left関数でできます。" : "の前までを取り出すので文字数は1文字引きます。

Left ( テキスト ; 位置 - 1 ) 

この時、ウィンドウ左下にある計算結果を「テキスト」にしておきます。ここが「数字」の状態だとテキスト中の音引きや句読点が半角で処理されてしまいます。

これでタイトルとサブタイトルを別々に格納することができました。

サブタイトルが無い場合はどうなるか

当然ながら、サブタイトルの無い書籍もあります。「位置」フィールドに返される値は0になるので、タイトルフィールドの計算式はマイナス値の文字数を返すものとなり空白を返し、サブタイトルフィールドの計算結果はテキストフィールドの文字数から2文字少ない分を右から拾うので、最初の2文字を消したテキストが返されます。

ですので、各フィールドの計算式に条件式をつけて、「位置」の値が0とそうでない場合で分けてやります。

タイトル=
If ( 位置 = 0 ; テキスト; Left ( テキスト ; 位置 -1 ))
サブタイトル=
If ( 位置=0 ; "" ; Right ( テキスト ; Length ( テキスト ) - 位置 ; 1 ; 1 )-2))

これでタイトルとサブタイトルを別々のフィールドに収めることができました。計算フィールドで処理してきました。使うシチュエーションによってスクリプトにする場合もありますが、基本的な計算式は同じです。

既存スクリプトに組み込む

ここからはこれまで作ってきたアプリに組み込むプロセスです。

ここから先は

1,760字 / 3画像
この記事のみ ¥ 200
期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?