Early Access: The content on this website is provided for informational purposes only in connection with pre-General Availability Qlik Products.
All content is subject to change and is provided without warranty.
跳到主要內容 跳至補充內容

資料清理

有時,您載入 Qlik Sense 的來源資料不一定是您想在 Qlik Sense 應用程式中顯示的樣子。Qlik Sense 提供了多種函數和陳述式,以方便您將資料轉換成我們想要的格式。

執行指令碼時,可以在 Qlik Sense 指令碼中使用對應來取代或修改欄位值或名稱,因此對應可用於清理資料,並確保更高的一致性,或者取代部分或全部欄位值。

從不同的表格載入資料時,代表相同事物的欄位值的命名不一定會一致。因為缺乏一致性會阻礙關聯,所以需要解決這個問題。透過建立欄位值比較的對應表格,即可漂亮地解決此問題。

對應表格

透過 Mapping 載入或 Mapping 選取載入的表格,與其他表格的處理方式有所不同。它們會儲存在記憶體的不同區域,並且僅在指令碼執行時作為對應表格之用。執行指令碼後,這些表格會被自動捨棄。

規則:

  • 對應表格必須有兩個資料行:第一個包含比較值,第二個包含所需的對應值。
  • 必須對這兩個資料行加以命名,但名稱本身沒有相關性。該資料行名稱和一般內部表格的欄位名稱並無關聯。

Mapping 函數和陳述式

本教學課程中將說明以下對應函數/陳述式:

Mapping 前置詞

ApplyMap()

MapSubstring()

Map … Using 陳述式

Unmap 陳述式

對應前置詞

Mapping 前置詞用於在指令碼中建立對應表格。對應表格可與 ApplyMap() 函數、MapSubstring() 函數或 Map … Using 陳述式一起使用。

  1. 建立新的應用程式並命名。
  2. 資料載入編輯器中新增新的指令碼區段。
  3. 叫用區段 Countries
  4. 輸入以下指令碼:
  5. CountryMap:
    MAPPING LOAD * INLINE [
    Country, NewCountry
    U.S.A., US
    U.S., US
    United States, US
    United States of America, US
    ];

    CountryMap 表格儲存兩個資料行:CountryNewCountryCountry 資料行將輸入的各種國家拼寫方式儲存在 Country 欄位中。NewCountry 資料行儲存各個值的對應方式。此對應表格將用於在 Country 欄位中儲存一致的US 國家值。例如,如果 U.S.A. 儲存在 Country 欄位中,將其對應為 US

ApplyMap() 函數

使用 ApplyMap() 根據之前建立的對應表格取代欄位中的資料。在使用 ApplyMap() 函數之前,需要先載入對應表格。您將載入的 Data.xlsx 表格中的資料如下所示:

資料表格
ID名稱國家/地區代碼
1John Black美國SDFGBS1DI
2Steve Johnson美國2ABC
3Mary White美國DJY3DFE34
4Susan McDanielsuDEF5556
5Dean SmithUSKSD111DKFJ1

請注意國家是以多種方式輸入的。為了確保國家欄位的一致性,已載入對應表格,並使用了 ApplyMap() 函數。

  1. 在您於上方輸入的指令碼之下,選取並載入 Data.xlsx,然後插入指令碼。
  2. 在新建立的 LOAD 陳述式之上輸入下列內容:
  3. Data:

    您的指令碼應如下所示:

    CountryMap:
    MAPPING LOAD * INLINE [
        Country, NewCountry
        U.S.A., US
        U.S., US
        United States, US
        United States of America, US
    ];
    	
    Data:
    LOAD
        ID,
        Name,
        Country,
        Code
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);

  4. 如下所示修改包括 Country, 的行:
  5. ApplyMap('CountryMap', Country) as Country,

    ApplyMap() 函數的首個參數的對應名稱用單引號括住了。第二個參數是其中的資料將被取代的欄位。

  6. 按一下載入資料
  7. 產生的表格如下所示:

    表格中顯示使用 ApplyMap() 函數載入的資料

    表格中顯示使用 ApplyMap 函數載入的資料。

    United States 的各種拼寫已全部變更為 US。有一個記錄沒有拼寫正確,因此 ApplyMap() 函數沒有變更該欄位值。使用 ApplyMap() 函數時,如果對應表格沒有配對的值,您可使用第三個參數新增預設運算式。

  8. 'US' 新增為 ApplyMap() 函數的第三個參數,以處理國家沒有正確輸入的情況:
  9. ApplyMap('CountryMap', Country, 'US') as Country,

    您的指令碼應如下所示:

    CountryMap:
    MAPPING LOAD * INLINE [
        Country, NewCountry
        U.S.A., US
        U.S., US
        United States, US
        United States of America, US
    ];
    
    Data:
    LOAD
        ID,
        Name,
        ApplyMap('CountryMap', Country, 'US') as Country,
        Code
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);

  10. 按一下載入資料
  11. 產生的表格如下所示:

    表格中顯示使用 ApplyMap 函數載入的資料

資訊備註若要進一步瞭解 ApplyMap(),請在 Qlik Community 中參閱此篇部落格貼文:請勿聯結 - 改用 Applymap

MapSubstring() 函數

透過 MapSubstring() 函數,您可以對應部分欄位。

ApplyMap() 建立的表格中,我們想要把數字寫成文字格式,所以將使用 MapSubstring() 函數把數字資料替換成文字。

要執行此操作,首先要建立一個對應表格。

  1. CountryMap 區段之後新增以下指令碼行,但必須加在 Data 區段之前。
  2. CodeMap:
    MAPPING LOAD * INLINE [
    F1, F2
    1, one
    2, two
    3, three
    4, four
    5, five
    11, eleven
    ];

    CodeMap 表格中,數字 1 至 5 以及 11 都有對應。

  3. 在指令碼的 Data 區段,如下所示修改 Code 陳述式:
  4. MapSubString('CodeMap', Code) as Code

    您的指令碼應如下所示:

    CountryMap:
    MAPPING LOAD * INLINE [
        Country, NewCountry
        U.S.A., US
        U.S., US
        United States, US
        United States of America, US
    ];
    
    CodeMap:
    MAPPING LOAD * INLINE [
        F1, F2
        1, one
        2, two
        3, three
        4, four
        5, five
        11, eleven
    ];
    
    Data:
    LOAD
        ID,
        Name,
        ApplyMap('CountryMap', Country, 'US') as Country,
        MapSubString('CodeMap', Code) as Code
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);

  5. 按一下載入資料
  6. 產生的表格如下所示:

    表格中顯示使用 MapSubString 函數載入的資料

    表格中顯示使用 MapSubString 函數載入的資料。

    Code 欄位中,數字字元已被文字取代。如果數字出現多次,如 ID=3ID=4 那樣,則同樣重複文字。ID=4Susan McDaniels 在其程式碼中有 6。因為 6 沒有在 CodeMap 表格中對應,因此將保持不變。ID=5Dean Smith 的程式碼中有 111。這已經被對應為 'elevenone'。

資訊備註若要進一步瞭解 MapSubstring(),請在 Qlik Community 中參閱此篇部落格貼文:Mapping … and not the geographical kind (對應 … 不是地理種類)

Map … Using

也可以使用 Map … Using 陳述式將對應套用至欄位。不過,這與 ApplyMap() 的運作方式有些不同。。ApplyMap() 處理每次欄位名稱遇到的對應問題,而 Map … Using 處理值儲存在內部表格中欄位名稱下遇到的對應問題。

讓我們來看一個例子。假設我們在指令碼中多次載入 Country 欄位,並希望每次載入欄位時,都能套用對應。像本課程教學之前說明的那樣,可以使用 ApplyMap() 函數,也可以使用 Map … Using

如果使用了 Map … Using,當欄位儲存在內部表格中時,對應將套用至欄位。在下面的範例中,對應被套用至 Data1 表格中的 Country 欄位,但不會被套用至 Data2 表格中的 Country2 欄位。這是因為 Map … Using 陳述式只能套用至名為 Country 的欄位。當 Country2 欄位儲存在內部表格中時,它的名稱不再是 Country。如要將對應套用至 Country2 表格,您必須使用 ApplyMap() 函數。

如果 Country 要在 Unmap 陳述式之後載入,則 Unmap 陳述式將終止 Map … Using 陳述式,系統不會套用 CountryMap

  1. 使用下列內容取代 Data 表格的指令碼:
  2. Map Country Using CountryMap;
    Data1:
    LOAD
        ID,
        Name,
        Country
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);
    					
    Data2:
    LOAD
        ID,
        Country as Country2
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);
    UNMAP;

  3. 按一下載入資料
  4. 產生的表格如下所示:

    表格中顯示使用 Map … Using 函數載入的資料

    表格中顯示使用 Map … Using 函數載入的資料。

此頁面是否對您有幫助?

若您發現此頁面或其內容有任何問題——錯字、遺漏步驟或技術錯誤——請告知我們可以如何改善!