### Yksinkertainen Vipusen rajapinnasta tietoa csv-tiedostoon noutava koodaus-Tiedostopolkuesimerkki ### 27.9.2022 CSC ### Huom. kaikki ### merkit sisältävät rivit ovat selityksiä varten, joten ne voi poistaa tiedostosta huoletta ### VALMISTELUT ### haetaan tarvittavat kirjastot ### Kirjastot voi asentaa install_packages()-funktiolla, esim. install_packages("httr") library(httr) library(jsonlite) library(dplyr) ### asetetaan pohjatietoja limit <- 5000 tietojoukko <- "alayksikkokoodisto" # muiden tietojoukkojen nimet löytyvät rajapinnasta: https://api.vipunen.fi/api/resources/ ### pohja rajapinnan urlille, johon myöhemmin lisätään offset arvo dynaamisesti. Limit-muuttuja on kokonaisluku (integer) joten se muunnetaan tekstiksi url_pohja=paste0("https://api.vipunen.fi/api/resources/", tietojoukko, "/data?limit=", limit, "&offset=") ### 5000 limit-arvolla 3. kierroksen osoite olisi siten https://api.vipunen.fi/api/resources/"+tietojoukko+"/data?limit=5000&offset=10000 ### Määritetään polku rajapinnan maksimiobjektien lukumäärän tiedustelua varten max_rivimaara_url <- paste0("https://api.vipunen.fi/api/resources/", tietojoukko, "/data/count") ### Dynaaminen tiedostopolkuesimerkki csv-tiedostolle Windows ### Voi määrittää myös ilman muuttujia esim. d:/temp/20210414_alayksikkokoodisto.csv tiedosto= paste0("d:/temp/",tietojoukko,".csv") ### Hyvä käytäntö on kertoa mikä organisaatio noutaa tietoja esim. "1.2.246.562.10.2013112012294919827487.Vipunen" CallerId <- "organisaatio_oid.organisaationimi" ### Haetaan maksimirivimäärä max_rivimaara-muuttujaan, jota hyödynnetään myöhemmin max_rivimaara <- as.integer( fromJSON( content( GET( max_rivimaara_url, add_headers("Caller-id" = CallerId)), "text"), flatten = "TRUE")) ### Määritetään laskurin alkuarvo, jota käytetään offset-arvon määrittämiseen laskuri=0 ### Määritetään mahdollisten virheiden varalta kuinka monta kertaa samat rivit yritetään ladata max_latausyritykset = 5 latausyritys = 0 ############################################### ### Varsinainen rajapintakysely alkaa tästä ### ############################################### ### Haetaan rajapinnasta aineistoa, kunnes saadaan kaikki talletettua tiedostoon while (laskuri <= max_rivimaara & max_latausyritykset > latausyritys){ ### Alustetaan ja nollataan apidata, johon rajapinnasta noudettu data väliaikaisesti talletetaan apidata <- data.frame() ### Tallennetaan rajapinnasta noudettu data apidata-tauluun apidata <- try(as.data.frame( fromJSON( content( GET( paste0(url_pohja, format(laskuri,scientific=FALSE)), add_headers("Caller-id" = CallerId)), "text"), flatten = "TRUE")), silent = TRUE) ### Tarkistetaan onnistuiko lataus if(class(apidata) != "try-error") { ### Write_mode-muuttujalla määritetään, että 1. kierroksella luodaan uusi tiedosto tai ### olemassa olemassaoleva ylikirjoitetaan. Jatkokierroksilla dataa vain lisätään tiedostoon ### Otsikkorivi kirjoitetaan vain ensimäisellä kierroksella if (laskuri == 0){ write_mode = FALSE ### Write otsikkorivi = TRUE } else{ write_mode = TRUE ### Append otsikkorivi = FALSE } ### Laskuriin lisätään haettavan tiedon määrä, jotta offset arvo muuttuu kun url seuraavan kerran määritetään luupissa laskuri <- laskuri + limit ### Muokkaa columns-listan sisältöä rajapinnan muuttujilla tarpeidesi mukaan columns <- c("tilastovuosi","organisaatioNimiFi","organisaatioNykyinenKoodi","oppilaitostyyppiFi", "alayksikkoKoodi","alayksikkoNimiFi") ### Data kirjoitetaan tai lisätään csv-tiedostoon jokaisella kyselykierroksella, ettei kaikkea haettua dataa käsitellä koneen muistissa. ### HUOM! Joidenkin rajapintojen datasta muodostetut tiedostot voivat kasvaa erittäin suuriksi write.table(apidata[, columns], tiedosto, append = write_mode, sep = ";", col.names = otsikkorivi, row.names = FALSE, quote = FALSE) ### Alla olevilla komennoilla seurataan latauksen edistymistä, joten ne voi automatisoinneista poistaa kokonaan if (laskuri > max_rivimaara) { print(max_rivimaara) } else { print(laskuri) } latausyritys = 0 ### Jos latausyritys epäonnistuu, odotetaan 1 sekunti ja yritetään uudestaan } else { latausyritys = latausyritys + 1 print(paste0(latausyritys, ". latausyritys epäonnistui")) Sys.sleep(1) } } ### Tulostetaan loppuun vielä tiedoksi, että datan nouto on valmis if(latausyritys == 0){ print(paste0("Valmis, ", max_rivimaara, " riviä haettu")) } else{ print("Latauksessa tapahtui virhe. Kaikkia tietoja ei pystytty hakemaan.") }