Alle artikler

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.