LoginSignup
0
0

Power BIデータモデルの型システム (2) テキスト型、論理型

Last updated at Posted at 2022-10-31

 Power BI DesktopとData Analysis Expressions (DAX) のデータ型について調べます。
 

3.テキスト型(STRING)

 Power Queryでは text型 と呼びますが、Power BIデータモデルでは STRING型 と呼びます。Unicode 文字のデータ文字列です。文字列の最大長は 268,435,456 Unicode 文字 (256 メガ文字) または 536,870,912 バイトです。

Case (in-)sensitivity(大文字と小文字の区別)

 大文字と小文字は区別されません。 テキスト型が読み込まれると、ハッシュエンコーディングされ、Power BIデータモデルにディクショナリ型で登録され、その辞書を使って表示します。

CaseSensitivity(PowerQuery)
let
    Source = 
        Table.FromRecords(
            {
                [OrderNo=1001, Addressee="Taina Hasu"],
                [OrderNo=1002, Addressee="Ellis Turner"],
                [OrderNo=1003, Addressee="MURALI DAS"],
                [OrderNo=1004, Addressee="TAINA HASU"],
                [OrderNo=1005, Addressee="Taina HASU"],
                [OrderNo=1006, Addressee="Ellis TURNER"],
                [OrderNo=1007, Addressee="Murali Das"]
            },
            type table [OrderNo = Number.Type, Addressee = Text.Type]
        )
in
    Source

g4367.png

 つまり、Power BIデータモデルでは、以下の図のように 最初に出現した文字に寄せられてしまいます

g4210.png

 これは、DAXでテーブルを直接作成しても同様の結果になります。

CaseSensitivity2(DAX)
CaseSensitivity2 = DATATABLE(
    "OrderNo", INTEGER,
    "Addressee", STRING,
    {
        {1001, "Taina Hasu"},
        {1002, "Ellis Turner"},
        {1003, "MURALI DAS"},
        {1004, "TAINA HASU"},
        {1005, "Taina HASU"},
        {1006, "Ellis TURNER"},
        {1007, "Murali Das"}
    }
)

image.png
 DAXでの文字列の比較の際も、以下の式は成立します。

比較
"Taina Hasu" = "TAINA HASU" // TRUE

 大文字小文字を区別して比較を行う場合は、 EXACT 関数を使用する方法があります。

EXACT
EXACT("Taina Hasu","TAINA HASU") // FALSE

 しかし、読み込み時に変換されたデータは、元の形を使ってマッチングすることはできません。

image.png

 日本語では、「吉」と「𠮷」は別の文字になりますし、問題になることはあまりないと思いますが、どうしても大文字小文字を区別させたい場合は、インデックス列と組み合わせたり、怪しげな方法を使う手もあります。

image.png

Trailing spaces(末尾のスペース)

 Power BIのエンジンは、文字列の末尾のスペースを除去しますが、先頭のスペースは削除されません
 下図は、左がPower Queryのデータで、右がPower BIに読み込まれたデータです。空白は「*」に置き換えて表示し、文字列の長さを横に示しています。

PowerQuery
let
    Source = 
        Table.FromRecords(
            {
                [No=1,Name="Dylan Williams"],
                [No=2,Name="Dylan Williams "],
                [No=3,Name=" Dylan Williams"],
                [No=4,Name="  Dylan Williams  "]
            },
            type table [No=Int64.Type, Name = Text.Type]
        ),
    ReplaceSpaceToAsterisk = Table.AddColumn(Source, "Name(PQ)", each Text.Replace([Name]," ", "*")),
    AddLength = Table.AddColumn(ReplaceSpaceToAsterisk, "Length(PQ)", each Text.Length([Name]))
in
    AddLength

 Power Queryで Text.Trim を使って先頭と末尾の空白を除去しておくことで、全て同一のものとして処理することができます。

4.論理型(BOOLEAN(True/False))

 TrueまたはFalseを示すブール値です。
 Power Queryでデータ型を設定せず、Any.Typeのまま読み込まれた場合、テキスト項目となります。

Bool1
let
    Source = 
        Table.FromRecords(
            {
                [CustomerNumber = 1001, Flag = false],
                [CustomerNumber = 1002, Flag = true],
                [CustomerNumber = 1003, Flag = true],
                [CustomerNumber = 1004, Flag = false],
                [CustomerNumber = 1005, Flag = true]
            }
        )
in
    Source

 この項目は、DAXでTrue/Falseの判定を行う場合、上図の「FlagCheck」の項目に見られるように期待通りの結果となります。

FlagCheck
FlagCheck = IF(Bool1[Flag], "ON", "OFF")

 このままで問題ないとされてしまうかもしれませんが、Power BIサービスに発行しデータセットの更新を行うと、以下のように表示が0と-1になってしまいます。
image.png
 全て問題なく動作させるためには、Power Queryの時点で型をtype logicalに設定しておくか、読み込んだ後にデータ型を変更しておきます。
image.png

関連記事

  1. [Power BI] Power Queryの『型』を探る (1) number
  2. [Power BI] Power Queryの『型』を探る (2) text, temporal falimy
  3. [Power BI] Power Queryの『型』を探る (3) number 蛇足
  4. [Power BI] Power Queryの『型』を探る (4) null
  5. [Power BI] Power Queryの『型』を探る (5) カスタム型
  6. Power BIデータモデルの型システム (1) 数値型、日付/時刻型
  7. Power BIデータモデルの型システム (2) テキスト型、論理型
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0