Czarodziej importowiec

Chciałem wam dzisiaj przedstawić świetne narzędzie MATLABa, jakim jest Import Wizard. Paradoksalnie, narzędzie wymaga przedstawienia tym z was, którzy posiadają dłuższy staż  pracy w środowisku - podejrzewam, że jeśli ktoś pierwszy kontakt z MATLAB złapał dopiero co, to pewnie w dosyć naturalny sposób na Import Wizard się natknął. Starsi użytkownicy z kolei nauczyli się ileś tam lat temu, że w celu wczytania do MATLABa danych z pliku, trzeba wpisać xlsread, csvread, imread itp. Jak się przypadkiem otworzy okno importu to zamkną, bo po co im to. No i okazuje się to pewnym błędem, bo z Import Wizard warto się zaznajomić - narzędzie pozwala usprawnić pracę. Zwłaszcza przy wczytywaniu danych z plików w formacie .xls czy .txt - przykładami z wczytywaniem takich właśnie plików zajmę się w tym wpisie.

Jak w ogóle narzędzie uruchomić? Można w command window wpisać polecenie

uiimport

Jednak w praktyce wygodniej jest w przeglądarce plików dwukrotnie kliknąć lewym przyciskiem myszy na pliku, który chcemy wczytać lub kliknąć prawym przyciskiem i z menu kontekstowego wybrać opcję Import Data. Dla zilustrowania procesu importu posłużę się plikiem zawierającym kursy średnie walut obcych w złotych pobranych ze strony NBP.
Po uruchomieniu "Czarodzieja importu" wyświetli nam się tabela z importowanymi danymi.

MATLAB Import Wizard
MATLAB import wizard

MATLAB domyślnie zaznacza elementy, które mają być wciągnięte do środowiska oraz określa rodzaj zmiennej dla każdej z importowanych kolumn. Sprawdza się to nadzwyczaj dobrze. W tym wypadku narzędzie wykryło, że pierwsze dwa wiersze nie zawierają danych do importu (znajdują się tu opisy kolumn) oraz to, że pierwsza kolumna zawiera dane dotyczące czasu.  Niemniej jednak pewne rzeczy wymagają poprawy.

  • Domyślnie dane są importowane na zasadzie: jedna kolumna do jednej zmiennej. Ponieważ kolumn jest w wczytywanym pliku xls bardzo dużo, lepszym rozwiązaniem będzie wskazanie, że dane mają trafić w MATLABie do zmiennej typu Table
  • Nie są mi potrzebne 2 ostatnie kolumny, więc zmienię zakres importowanych danych z A3:AM254 na A3:AK254
  • Ponieważ w drugim wierszu pierwszej kolumny brakuje wpisu, należy ręcznie wskazać jak ma się nazywać kolumna nr 1 po zaimportowaniu (jeśli nic nie zmienię, otrzyma ona nazwę VarName1 )

Zmiany konfiguracji import wizard

Gotowe. Co trzeba by było zrobić, by analogiczna operacje wykonać z linii poleceń MATLABa? Samo wczytanie wartości numerycznych do tabeli nie jest trudne.

T = readtable('kursyNBP2014.xls','Range','A3:AK254','ReadVariableNames',false);

Tylko, że to dopiero początek. Należy jeszcze zmienić typ danych w pierwszej kolumnie na datetime, co jest jeszcze proste, a następnie nadać nazwy wszystkim kolumnom zgodnie z tym, co znajduje się w drugim wierszu arkusza. To już niestety wymaga sporego nakładu pracy - trzeba wczytać odpowiedni wiersz arkusza, a następnie pozbyć się wszystkich niedozwolonych znaków, które nie mogą się znaleźć w nazwie zmiennej (znaki nawiasu, litera ń w dolar amerykański itp.)  Aktualizacja: akurat w tym wypadku można zmienić w poleceniu importu zakres na A2:AK254 i będzie działać.
Być może ktoś powie - warto, bo to zautomatyzuje moją pracę na przyszłość. Jeśli będę pracował z kolejnymi plikami xls z podobną zawartością, to chyba lepiej przygotować sobie odpowiedni skrypt, niż za każdym razem wyklikiwać w GUI wiecznie to samo? Nieprawda. Korzystając z Import Wizard wcale nie musimy rezygnować z automatyzacji pracy. Po zakończonym setup należy tylko rozwinąć menu znajdujące się pod znakiem "ptaszka" i wybrać jedną z dwóch opcji: Generate Script lub Generate Function.

Generuj skrypt
Tym sposobem możemy wygenerować skrypt lub m-funkcje, którą z powodzeniem można stosować na kolejnych plikach - o ile pliki te będą zorganizowane podobnie do pierwowzoru. Można się spodziewać, że w przypadku tabel NBP układ arkusza będzie identyczny dla wszystkich dostępnych roczników, więc wystarczy tylko uruchomić wcześniej przygotowaną funkcję podając nową nazwę pliku i gotowe!

function tableout = importfile(workbookFile,sheetName,startRow,endRow)
%IMPORTFILE Import data from a spreadsheet
%   DATA = IMPORTFILE(FILE) reads data from the first worksheet in the
%   Microsoft Excel spreadsheet file named FILE and returns the data as a
%   table.
...

Narzędzie pozwoli nam zaoszczędzić jeszcze więcej czasu  przy pracy z plikami tekstowymi z nietypową zawartością. Wydawać by się mogło, że w przypadku skomplikowanego pliku tekstowego jedynym sensownym rozwiązaniem będzie niskopoziomowa walka z pomocą funkcji textscan. Zapewne, w niektórych przypadkach nie będzie się dało inaczej (choćby ze względu na wielkość pliku), jednak jeśli tylko można - proponuję uruchomić Import Wizard. Rezultaty są naprawdę dobre.

(Visited 2 826 times, 1 visits today)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *