Processing.js
Processing
Børre Stenseth
p5js >Dataformater

Dataformater

Hva

p5js har en del funksjonalitet som lar oss laste og bruke noen vanlige dataformater på en enkel måte. Det finnes en rekke verktøy i Javascript som gjør tilsvarende, men p5js-løsningene er lett tilgjengelige og greie.

Vi skal se på text, json og xml. Alle er en beskrivelse av relutatet av stortingsvalget 2017.

Den sketcen vi skal lage produserer i all sin enkelhet dette:

Utgangspunktet er resultatene fra stortingsvalget 2017. Vi leser inn dette i tre formater og skriver en kolonne for hvert datasett.

Sketchen er slik:

_sketch.js
var jsonValg;  
var csvValg;
var xmlValg;
function preload(){
    jsonValg=loadJSON("data/valg.json");
    csvValg=loadStrings('data/valg.csv');
    xmlValg=loadXML('data/valg.xml');
}
function setup() {
    var canvas = createCanvas(450, 250);
    canvas.parent('canvasHere');
    fill(0);
    textFont("SansSerif",14);
}
function draw() {
    background(255);
    showJsonData(jsonValg,0);
    showCsvData(csvValg,150);
    showXmlData(xmlValg,300);
    noLoop();
}

Text

p5js lar oss laste inn en tekstfil som en array av linjer med funksjonen loadStrings(). I dette eksempelet har vi laget en enkel fil. Vi bruker den første linja til tittel og vi ignorerer alle linjer som begynner med // eller er mindre enn 10 tegn lange. I de andre linjene skiller vi datafeltene med ;. Altså Comma Separated Values (CSV) med ; som skilletegn. Fargen er lagt ut som RGB-verdier, skilt med komma. Fila er slik:

_data/valg.csv

Parsing og utskrift. Merk at push() lagrer status både på koordinatsystemet og stilsettinger, og pop() gjennoppretter tilsvarende.

_showCsv.js
function showCsvData(lines,left){
    push();
    translate(left,0);
    text("CSV",0,20);
    text(lines[0],0,40);
    var yPos=60;
    for(var i=1; i< lines.length;i++){
        if((!lines[i].startsWith("//")||
           (lines[i].length< 10))){
            var parts=lines[i].split(";");
            var cs=parts[2].split(",");
            fill(cs[0],cs[2],cs[2]);
            text(parts[0],0,yPos);
            text(parts[1],50,yPos);
            yPos+=16;
        }
    }
    pop();
}

Fordelene med csv-filer er at de tar liten plass og at de er enkle å ha med å gjøre. Ulempene er at vi har lite kontroll med at formatet er riktig.

JSON

I p5js laster vi inn en json-fil med loadJASON(). Fila parses og vi kommer ut med et JavaScript objekt Dette er file vi bruker:

_data/valg.json

Parsing og utskrift

_showJson.js
function showJsonData(jsObj,left){
    push();
    translate(left,0);
    text("JSON",0,20);
    text(jsObj.tittel,0,40);
    var res=jsObj.resultater;
    var yPos=60;
    for(var i=0; i< res.length;i++){
        var cs=res[i].farge.split(",");
        fill(cs[0],cs[2],cs[2]);
        text(res[i].navn,0,yPos);
        text(res[i].verdi,50,yPos);
        yPos+=16;
    }
    pop();
}

Fordelene med json-filer er at lett kan sjekkes om de er formelt riktige, men vi har ingen enkel metode forå sjekke f.eks. at alle verdier er lagt inn og at formatet på enkeltelementer er riktig.

XML

I p5js laste inn en json-fil med loadXML() og vi sitter igjen med rotobjektet.

_data/valg.xml

Parsing og utskrift

_showXml.js
function showXmlData(xmlObj,left){
    push();
    translate(left,0);
    text("XML",0,20);
    text(xmlObj.getString("tittel"),0,40);
    var yPos=60;
    var res=xmlObj.getChildren("parti");
    for(var i=0; i< res.length;i++){
        var navn=res[i].getString("navn");
        var verdi=res[i].getChildren("verdi")[0].getContent();
        var cs=res[i].getChildren("farge")[0].getContent().split(",");
        fill(cs[0],cs[2],cs[2]);
        text(navn,0,yPos);
        text(verdi,50,yPos);
        yPos+=16;
    }    
    pop();
}

Fordelene med xml-filer er vi har verktøy som lar oss validere og sjekke at formatet er riktig (XSD), vi kan endre formatet etter formålet (XSLT). Vi kan også verktøy for å ekstrahere data på en enkel måte, (xpath). Ulempen er at de tar ganske mye plass.

[1]
Referanser
  1. Processing.js Processing.js JavaScript interpretator for Processing processingjs.org/ 01-04-2014
p5js >Dataformater