# Czyszczenie danych

Czasami konieczne jest przetworzenie danych źródłowych ładowanych do Qlik Sense, aby w aplikacji Qlik Sense miały one pożądaną postać. W rozwiązaniu Qlik Sense dostępnych jest wiele funkcji i instrukcji umożliwiających przekształcanie danych do odpowiedniego formatu.

W skrypcie Qlik Sense można stosować mapowanie w celu zastępowania lub modyfikowania wartości lub nazw pól podczas wykonywania skryptu. Mapowanie umożliwia więc czyszczenie danych i poprawianie ich spójności, jak również zastępowanie wartości pól w części lub w całości.

Podczas ładowania danych z różnych tabel często zdarza się, że pola o identycznym znaczeniu mają różne nazwy. Takie niespójności utrudniają tworzenie asocjacji, więc konieczne jest ich korygowanie. Elegancką metodą rozwiązania tego problemu jest utworzenie tabeli mapowania używanej do porównywania wartości pól.

## Tabele mapowania

Tabele ładowane za pomocą Mapping load lub Mapping select są traktowane inaczej niż inne tabele. Są one przechowywane w odrębnym obszarze pamięci i używane wyłącznie jako tabele mapowania podczas wykonywania skryptu. Po wykonaniu skryptu tabele te są automatycznie usuwane.

### Reguły:

* Tabela mapowania musi zawierać dokładnie dwie kolumny, z których pierwsza zawiera wartości sprawdzane, a druga pożądane wartości docelowe mapowania.
* Obie kolumny muszą mieć nazwy, ale same nazwy nie mają żadnego znaczenia. Podane tu nazwy kolumn nie są w żaden sposób związane z nazwami pól zwykłych tabel wewnętrznych.

## Funkcje i instrukcje Mapping

W tym kursie zostaną omówione następujące funkcje i instrukcje mapowania:

• Prefiks Mapping

• ApplyMap()

• MapSubstring()

• Instrukcja Map … Using

• Instrukcja Unmap

## Prefiks Mapping

Prefiks Mapping służy do utworzenia tabeli mapowania w skrypcie. Takiej tabeli mapowania można następnie używać z funkcją ApplyMap(), funkcją MapSubstring() lub instrukcją Map … Using.

Wykonaj następujące czynności:

1. Utwórz nową aplikację i nadaj jej nazwę.
2. Dodaj nową sekcję skryptu w edytorze ładowania danych.
3. Wywołaj sekcję Countries.
4. Wprowadź następujący skrypt:
   ```
   CountryMap:
   MAPPING LOAD * INLINE [
   Country, NewCountry
   U.S.A., US
   U.S., US
   United States, US
   United States of America, US
   ];
   ```

   Tabela CountryMap zawiera dwie kolumny: Country i NewCountry. Kolumna Country zawiera różne wersje nazw krajów wpisane w polu Country. Kolumna NewCountry zawiera mapowania tych wartości. Tabela mapowania posłuży do zapisywania w polu Country spójnych wartości odpowiadających Stanom Zjednoczonym (w tym przypadku US). Jeśli na przykład pole Country zawiera wartość U.S.A., zostanie ona zmapowana na US.

## ApplyMap() funkcja

Użyj ApplyMap(), aby zastąpić dane w polu na podstawie wcześniej utworzonej tabeli mapowania. Przed użyciem funkcji ApplyMap() trzeba załadować odpowiednią tabelę mapowania. Dane w tabeli Data.xlsx, które zostaną załadowane, wyglądają następująco:

Tabela danych

| Identyfikator | Nazwa | Kraj | Kod |
| --- | --- | --- | --- |
| 1 | John Black | U.S.A. | SDFGBS1DI |
| 2 | Steve Johnson | U.S. | 2ABC |
| 3 | Mary White | Stany Zjednoczone | DJY3DFE34 |
| 4 | Susan McDaniels | u | DEF5556 |
| 5 | Dean Smith | US | KSD111DKFJ1 |

Należy zauważyć, że kraj jest wprowadzany na różne sposoby. Aby zawartość pola kraju była spójna, ładujemy tabelę mapowania i używamy funkcji ApplyMap().

Wykonaj następujące czynności:

1. Poniżej skryptu wprowadzonego powyżej wybierz i załaduj plik Data.xlsx, a następnie wstaw skrypt.
2. Wprowadź następujące dane powyżej nowej utworzonej instrukcji LOAD:
   ```
   Data:
   ```

   Skrypt powinien wyglądać następująco:
   ```
   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);
   ```
3. Zmodyfikuj wiersz zawierający pole `Country,` w następujący sposób:
   ```
   ApplyMap('CountryMap', Country) as Country,
   ```

   Pierwszy parametr funkcji ApplyMap() to nazwa mapy w pojedynczych cudzysłowach. Drugi parametr określa pole zawierające dane, które będą zastępowane.
4. Kliknij polecenie Ładuj dane.

   Wynikowa tabela wygląda następująco:

   Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMap()

   Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMap()

   Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMap()ApplyMap() ![Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMap](https://help.qlik.com/pl-PL/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-applymap.png)

   Wszystkie warianty nazwy United States zostały zamienione na US. Jeden z rekordów zawierał błąd pisowni, więc funkcja ApplyMap() nie zmieniła tej wartości pola. Do funkcji ApplyMap() można dodać trzeci parametr w celu określenia wyrażenia domyślnego, które będzie używane w razie braku pasującej wartości w tabeli mapowania.
5. Dodaj wartość 'US' jako trzeci parametr funkcji ApplyMap(), co pozwoli obsłużyć przypadki nieprawidłowego wpisania kraju:
   ```
   ApplyMap('CountryMap', Country, 'US') as Country,
   ```

   Skrypt powinien wyglądać następująco:
   ```
   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);
   ```
6. Kliknij polecenie Ładuj dane.

   Wynikowa tabela wygląda następująco:

   Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMap

   Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMap

   Tabela przedstawia dane załadowane przy użyciu funkcji ApplyMapApplyMap ![](https://help.qlik.com/pl-PL/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-applymap-updated.png)

InformacjaAby dowiedzieć się więcej o ApplyMap(), zobacz ten wpis na blogu w Qlik Community: [Nie łącz – użyj zamiast tego Applymap](https://community.qlik.com/t5/Qlik-Design-Blog/Don-t-join-use-Applymap-instead/ba-p/1467592)

## MapSubstring() funkcja

Funkcja MapSubstring() umożliwia mapowanie części pola.

Przetworzymy tabelę utworzoną przez funkcję ApplyMap(), aby liczby były zapisane słownie. Funkcja MapSubstring() posłuży do zastąpienia danych liczbowych tekstem.

W tym celu trzeba najpierw utworzyć tabelę mapowania.

Wykonaj następujące czynności:

1. Dodaj następujące wiersze skryptu po sekcji CountryMap, ale przed sekcją Data.
   ```
   CodeMap:
   MAPPING LOAD * INLINE [
   F1, F2
   1, one
   2, two
   3, three
   4, four
   5, five
   11, eleven
   ];
   ```

   Tabela CodeMap mapuje liczby od 1 do 5 oraz liczbę 11.
2. W sekcji Data skryptu zmodyfikuj instrukcję Code następująco:
   ```
   MapSubString('CodeMap', Code) as Code
   ```

   Skrypt powinien wyglądać następująco:
   ```
   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);
   ```
3. Kliknij polecenie Ładuj dane.

   Wynikowa tabela wygląda następująco:

   Tabela przedstawia dane załadowane przy użyciu funkcji MapSubString

   Tabela przedstawia dane załadowane przy użyciu funkcji MapSubString

   Tabela przedstawia dane załadowane przy użyciu funkcji MapSubStringMapSubString ![Tabela przedstawia dane załadowane przy użyciu funkcji MapSubString.](https://help.qlik.com/pl-PL/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-mapsubstring.png)

   Zapisy liczbowe w polu Code zostały zastąpione tekstem. Jeśli liczba występuje więcej niż raz, jak w przypadku ID=3 i ID=4, tekst również jest powtarzany. ID=4. Susan McDaniels zawiera wartość 6 w kodzie. Ponieważ dla liczby 6 nie określono mapowania w tabeli CodeMap, pozostała ona bez zmian. W kodzie osoby o ID=5 (Dean Smith) występowała liczba 111. Została ona zmapowana jako „elevenone”.

InformacjaAby dowiedzieć się więcej o MapSubstring(), zobacz ten wpis na blogu w Qlik Community: [Mapowanie… i nie w sensie geograficznym](https://community.qlik.com/t5/Qlik-Design-Blog/Mapping-and-not-the-geographical-kind/ba-p/1463192)

## Map … Using

Za pomocą funkcji Map … Using można zastosować mapę do pola. Jednak, działa to trochę inaczej niż w przypadku funkcji ApplyMap(). W przypadku funkcji ApplyMap() mapowanie jest stosowane przy każdym napotkaniu nazwy pola przy przetwarzaniu, natomiast instrukcja Map … Using dokonuje mapowania na etapie zapisywania wartości w tabeli wewnętrznej w polu o określonej nazwie.

Przyjrzyjmy się przykładowi. Załóżmy, że wielokrotnie ładujemy pole Country w skrypcie i chcemy stosować mapowanie przy każdym załadowaniu. Można do tego celu użyć funkcji ApplyMap(), jak we wcześniejszej części tego kursu, lub skorzystać z instrukcji Map … Using.

Zastosowanie instrukcji Map … Using spowoduje zastosowanie mapy do pola na etapie zapisywania pola w tabeli wewnętrznej. W poniższym przykładzie mapowanie zostanie zastosowane do pola Country w tabeli Data1, ale nie do pola Country2 w tabeli Data2. Wynika to stąd, że instrukcja Map … Using jest stosowana jedynie do pól o nazwie Country. Po zapisaniu w tabeli wewnętrznej pole Country2 nie ma już nazwy Country. Jeśli mapowanie miałoby być stosowane również do tabeli Country2, należałoby użyć funkcji ApplyMap().

Instrukcja Unmap kończy instrukcję Map … Using, więc gdyby pole Country zostało załadowane po instrukcji Unmap, tabela mapowania CountryMap nie zostałaby zastosowana.

Wykonaj następujące czynności:

1. Skrypt dla tabeli Data zastąp następującym skryptem:
   ```
   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;
   ```
2. Kliknij polecenie Ładuj dane.

   Wynikowa tabela wygląda następująco:

   Tabela przedstawia dane załadowane przy użyciu funkcji Map … Using

   Tabela przedstawia dane załadowane przy użyciu funkcji Map … Using

   Tabela przedstawia dane załadowane przy użyciu funkcji Map … UsingMap … Using ![Tabela przedstawia dane załadowane przy użyciu funkcji Map … Using.](https://help.qlik.com/pl-PL/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-mapusing.png)