Hente og formatere data fra internett til en PostgreSQL database
I denne øvelsen skal vi hente en oversikt over land og landskoder fra nettet, trekke ut de data vi vil ha og formatere data med riktig tegnsett, og til slutt importere dem i en PostgreSQL-database.
Hente data fra SSB
Ved å søke på landskoder fra nettsiden data.norge.no finner vi lenken til et datasett fra SSB:
https://data.ssb.no/api/klass/v1/versions/1693.csv
Det kan vi hente med wget:
$ wget https://data.ssb.no/api/klass/v1/versions/1693.csv
med kommandoen head kan vi se strukturen på dataene:
Formatere data slik vi vil ha dem
$ head 1693.csv
"code";"parentCode";"level";"name";"shortName";"notes";"validFrom";"validTo"
"97";"";"1";"Land og territorier som ikke er spesifisert";;""
"AD";"";"1";"Andorra";;""
"AE";"";"1";"De forente arabiske emirater";;""
"AF";"";"1";"Afghanistan";;""
"AG";"";"1";"Antigua og Barbuda";;""
"AI";"";"1";"Anguilla";;"Separerte seg fra St. Kitts og Nevis (KN, KNA, 659, 657)."
"AL";"";"1";"Albania";;""
"AM";"";"1";"Armenia";;"Tidligere Sovjetunionen (SU, SUN, 810, 135)."
"AO";"";"1";"Angola";;"Portugisisk koloni fram til 1975."
Vi ser at vi vil ha kolonne 1 og 4 - dvs. code og name og at semikolon er brukt som skilletegn
Vi trekker ut disse feltene med kommandoen cut, slii:
$ cat 1693.csv | cut -f 1,4 -d ';' --output-delimiter ',' > landskoder.csv
Vi har samtidig gjort filen om til en kommaseparert fil.
Med tail ser vi at bokstaven ø ikke kommer ut riktig:
$ tail landskoder.csv
"WF","Wallis- og Futuna�yene"
"WS","Samoa"
"XB","Kanari�yene"
"XC","Ceuta og Melilla"
"XK","Kosovo"
"YE","Jemen"
"YT","Mayotte"
"ZA","S�r-Afrika"
"ZM","Zambia"
Kommandoen file gir oss informasjon om filen:
$ file landskoder.csv
landskoder.csv: CSV ISO-8859 text
Vi ser at SSB har brukt et gammelt tegnsett: ISO-8859, og vi vil gjøre det om til utf8. Det kan vi gjøre med programmet iconv, slik:
$ iconv -f ISO_8859-1 -t UTF-8 landskoder.csv > utf8_landskoder.csv
Forklaring: -f = from, -t = to
Tips: iconv --list gir en liste over alle tegnsettene
En tail viser at ø nå er riktig tolket av utf-8 tegnsettet.
$ tail utf8_landskoder.csv
"WF","Wallis- og Futunaøyene"
"WS","Samoa"
"XB","Kanariøyene"
"XC","Ceuta og Melilla"
"XK","Kosovo"
"YE","Jemen"
"YT","Mayotte"
"ZA","Sør-Afrika"
"ZM","Zambia"
"ZW","Zimbabwe"
Importere data i en PostgreSQL-database
Vi kan bruke treminalklienten psql til dette. Først oppretter vi en tabell vi kan putte data i, så importerer vi dem fra csv-filen med \copy - kommandoen:
$ psql
terje=# create table landskoder (kode char(4) primary key, land text);
CREATE TABLE
terje=# \copy landskoder from utf8_landskoder.csv CSV
COPY 254
terje=# select * from landskoder limit 5;
kode | land
------+---------------------------------------------
code | name
97 | Land og territorier som ikke er spesifisert
AD | Andorra
AE | De forente arabiske emirater
AF | Afghanistan
(5 rows)
Vi ser at vi ikke trenger de to første radene, så de kan vi slette:
terje=# delete from landskoder where kode = 'code' or kode = '97';
DELETE 2
Og da har vi en tabell vi kan bruke.