MATLAB Tutorial #11

Import danych z wielu plików

W zasadzie tutorial został zakończony. Celem dotychczasowych wpisów serii było zaznajomienie użytkownika ze środowiskiem MATLAB na tyle, by mógł on usiąść przed komputerem i zacząć z programem w miarę wygodnie pracować. Oczywiście w praktyce, gdy przychodzi zmierzyć się z rzeczywistym problemem, dość szybko okazuje się, że czegoś ważnego w tutorialu nie było… No i jest to jak najbardziej zrozumiała sytuacja. Wszystkiego zamknąć w krótkim samouczku nie sposób, można jednak poruszyć kilka dość często pojawiających się problemów. A jeden z najczęściej pojawiających się, to problem sprawnego odczytu danych z wielu plików.

Dla przykładu weźmy dane dotyczące średnich kursów wymiany walut, które od dekad zbiera Narodowy Bank Polski. Dane są udostępniane na stronie internetowej w formie plików .xls. Dla uproszczenie przyjmijmy, że wszystkie pliki zostały zebrane w jednym katalogu, naszym katalogu roboczym.
W MATLABie możemy korzystać z poleceń dir oraz ls, które odpowiedzialne są za wyświetlenie informacji o plikach znajdujących się we wskazanym katalogu.

pliki = dir

Jeśli interesujących nas plików z danymi jest więcej niż jeden, to mają one zazwyczaj podobną nazwę lub przynajmniej rozszerzenie. Możemy to podczas uruchamiania  funkcji dir wykorzystać.

pliki = dir('archiwum*.xls'); % uwzględnone zostaną pliki rozpoczynające się od archiwum i z zakończeniem .xls

Po wykonaniu polecenia w workspace zostanie utworzona macierz struktur pliki z informacją na temat każdego ze znalezionych plików (nazwa, ścieżka dostępu, rozmiar...). W pierwszej chwili może się to wydawać zagmatwane, trzeba to sobie powoli rozłożyć na czynniki pierwsze. Nowa zmienna w workspace, pliki to wektor. Każdy element tego wektora to struktura zawierająca szereg pól. Jeśli chcemy dowiedzieć się jak nazywa się trzeci znaleziony w katalogu plik, konstruujemy następujące polecenie:

pliki(3).name

ans =

'archiwum_tab_a_1986.xls'

Struktura danych

Przed podjęciem dalszych kroków należy się dobrze zastanowić nad kwestia tego, w jakiej strukturze będziemy chcieli umieścić dane. Niestety zwykła macierz nie zawsze jest opcją, która wchodzi w grę. Załóżmy, że interesuje nas wyłącznie kurs wymiany dolara amerykańskiego. Dane w plikach w różnych latach mogą wyglądać kompletnie odmiennie i nie chodzi tu bynajmniej o to, że zmieniają się same kursy wymiany. Zmienić się może położenie kolumny w pliku ale również, co może być najbardziej kłopotliwe, zmienić się może długość kolumny danych. Odpowiednie ułożenie danych może być więc nie lada wyzwaniem. W takim wypadku warto rozważyć wykorzystanie macierzy typu cell , która została stworzona do  przechowywania w niej danych różnego typu i o różnych, nieprzystających rozmiarach. Wymiary samej macierzy muszą zostać jednak określone.

dolary = cell(size(pliki));

Kolejny krok to stworzenie pętli, w której oprócz odczytu danych z plików przeprowadzone jest poszukiwanie pożądanej kolumny.  Samo poszukiwanie dolarowej kolumny nie jest w tym momencie istotne. Co ważne, to sposób zapisu kolumny do macierzy dolary. Przy zapisie do macierzy typu cell posługujemy się nawiasami klamrowymi!

 

for i = 1:length(pliki)
    [data,txt] = xlsread(pliki(i).name); % odczyt danych z i-tego pliku
    usa = strcmpi(txt, 'USA');
    usd = strcmpi(txt, 'USD');
    usd1 = strcmpi(txt, '1 USD');
    US = usa | usd | usd1; % poszukiwanie identyfikatora wskazującego na dolarową kolumnę
    [w, k] = find(US);
    dolary{i} = data(:, k(1)); % zapis kolumny do macierzy dolary
end

Wynikowy wektor dolary składa się z ponad 30 elementów, a każdy z tych elementów to numeryczny wektor. Ponieważ każdy z wektorów ma inną długość, nie ma możliwości by wszystkie te wartości połączyć w "normalnej" macierzy. No chyba, że chcemy utworzyć jeden wektor.

D = cell2mat(dolary(1:10))
plot(D); grid; xticklabels('');

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *