Narzędzia użytkownika

Narzędzia witryny


ewdprocedury_pobieranie_bazy_szkol

To jest stara wersja strony!


Eksport z bazy danych informacji o szkołach

Skrypt pobiera informacje o szkołach z bazy (przez ODBC). Nazwy kolumn w zwracanych plikach są nieco „oldschoolowe” - odtwarzają konwencję z bazy szkół prowadzonej jeszcze w pliku SPSSa, zanim baza SQLowa powstała i pochłonęła wszystko.

Typowo interesujący jest plik wyjściowy w postaci długiej (jeśli chodzi o nazwę szkoły i dane adresowe zawiera on tylko najbardziej aktualne informacje).

Obecnie na raz można pobrać informacje tylko o szkołach jednego typu.

typSzkoly     = "typ"              # dozwolone wartości: "gimn.", "LO", "LP", "T"
zapiszDlugi   = "nazwa_pliku.csv"  # lub NULL jeśli plik w formacie szerokim ma nie być zapisywany
zapiszSzeroki = "nazwa_pliku.csv"  # lub NULL jeśli plik w formacie szerokim ma nie być zapisywany
zrodloODBC    = "EWD"              # ew. dostosować

library(RODBCext)
setwd("~/Desktop/")

dozwoloneTypy = c("gimn.", "LO", "LP", "T")
przyrostki    = c("g"    , "lo", "lo", "t")
if (typSzkoly %in% dozwoloneTypy) {
  przyr = przyrostki[dozwoloneTypy == typSzkoly]
  # samo pobieranie
  p = odbcConnect(zrodloODBC)
  szkoly = sqlExecute(
    p,
    "SELECT rok, id_szkoly AS id_szkoly_strona, id_szkoly_ewd, id_szkoly_oke,
      typ_szkoly, publiczna, dla_doroslych, specjalna, przyszpitalna,
      nazwa, adres, miejscowosc, pna, poczta, wielkosc_miejscowosci AS l_mieszk,
      id_wojewodztwa AS wojewodztwo, id_powiatu AS powiat, id_gminy AS gmina,
      matura_miedzynarodowa AS ib
    FROM (SELECT * FROM szkoly WHERE typ_szkoly = ?) AS szkoly
      JOIN szkoly_dane USING (id_szkoly)
    WHERE id_szkoly > 0 AND rok > 2005
    ORDER BY id_szkoly_ewd, rok;",
    typSzkoly,
    fetch=T, stringsAsFactors=F
  )
  odbcClose(p)
  
  # trochę ręcznego tuningu z nazwami zmiennych (do stylu "dawno temu, przed bazą SQL")
  names(szkoly) = sub("id_szkoly_ewd", paste0("id_" , przyr), names(szkoly))
  names(szkoly) = sub("id_szkoly_oke", paste0("kod_", przyr), names(szkoly))
  # matura międzynarodowa nie ma nic wspólnego z gimnazjami
  if (typSzkoly=="gimn.") szkoly = szkoly[, names(szkoly) != "ib"]
  # TERYT w jedną zmienną
  szkoly = within(szkoly, {teryt = 10000 * wojewodztwo + 100 * powiat + gmina})
  szkoly = szkoly[, !(names(szkoly) %in% c("powiat", "gmina"))]
  # OKE na podstawie województwa
  szkoly = within(szkoly, {
    oke = c("Wrocław", "Gdańsk", "Kraków", "Poznań", "Łódź", "Kraków", "Warszawa", "Wrocław",
            "Kraków", "Łomża", "Gdańsk", "Jaworzno", "Łódź", "Łomża", "Poznań", "Poznań")[wojewodztwo/2]
  })
  # jeśli pobieramy technika, typ szkoły może być uznany za zmienną logiczną
  if (is.logical(szkoly$typ_szkoly)) szkoly$typ_szkoly = "T"

  # ew. zapis formy długiej
  if (!is.null(zapiszDlugi)) write.csv2(szkoly, zapiszDlugi, row.names=FALSE, na="", fileEncoding="UTF-8")
  
  # ew. przekształcenie do postaci szerokiej
  if (!is.null(zapiszSzeroki)) {
    # reshape() działa dużo szybciej, jeśli nie przepuszczać przez nią tego, co możemy dołączyć w inny sposób
    drop = names(szkoly)[!(names(szkoly) %in% c("id_szkoly_strona", "rok",
                                                "kod_g", "kod_lo", "kod_t", "l_mieszk", "ib"))]
    kody = reshape(szkoly, timevar="rok", idvar=c("id_szkoly_strona"), direction="wide", drop=drop, sep="_")
    kody = kody[, c(names(kody)[1], sort(names(kody)[-1], decreasing=TRUE))]
    # jeśli chodzi o inne informacje, to zostawiamy sobie tylko najświeższe (z najpóźniejszego roku)
    szkoly = szkoly[order(szkoly$rok, decreasing=TRUE), ]
    inneInfo = aggregate(
      szkoly[, !grepl("^id_|^kod_|^rok$|^l_mieszk$|^ib$", names(szkoly))],
      by=as.list(szkoly[, grepl("^id_", names(szkoly))]),
      function(x) {return(x[!is.na(x)][1])}
    )
    # i łączymy w jedno
    polaczone = merge(kody, inneInfo)
    # definicja kolejności kolumn
    nazwyKolumn = c(
      names(polaczone)[grepl("^id_[^s]", names(polaczone))],
      "wojewodztwo", "oke", "nazwa", "adres", "miejscowosc", "pna", "poczta",
      "typ_szkoly", "publiczna", "dla_doroslych", "specjalna", "przyszpitalna",
      names(polaczone)[grepl("^kod_", names(polaczone))],
      names(polaczone)[grepl("^ib_", names(polaczone))],
      "teryt",
      names(polaczone)[grepl("^l_mieszk_", names(polaczone))],
      "id_szkoly_strona"
    )
    # sortujemy obserwacje i kolumny
    polaczone = polaczone[order(polaczone[, grepl("^id_[^s]", names(polaczone))]), nazwyKolumn]

    # zapis
    write.csv2(polaczone, zapiszSzeroki, row.names=FALSE, na="", fileEncoding="UTF-8")
  }
} else {
  stop("Niedozwolony typ szkoły!")
}
ewdprocedury_pobieranie_bazy_szkol.1406835697.txt.gz · ostatnio zmienione: 2014/07/31 21:41 przez t.zoltak