2016-12-14 1 views
1

Ich möchte D3 v3.5.6 verwenden, um eine CSV-Zeichenfolge in ein Javascript-Objekt zu konvertieren, wobei Spaltennamen Schlüssel sind und ihre Daten in Arrays sind.D3: Wie analysiere ich eine CSV-Zeichenfolge in ein Objekt, in dem Schlüssel Spaltennamen sind und Werte Arrays von Daten sind?

Mein JS so weit:

var csvString= 'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n'; 
var headers = [] 
d3.csv.parse(csvString, function(data){ 
    headers = d3.keys(data); 
}); 

Dies füllt Array headers mit Streichern von Spaltennamen, aber ich kann nicht herausfinden, wie die Daten zu erhalten.

würde Ich mag ein Objekt wie folgt machen:

{ 
    "date": ["1/1/16","1/3/16","1/5/16"], 
    "dow": ["10","5","12"], 
    ... 
} 

Ist dies möglich, mit nur D3?

Hier ist der String CSV in leicht zu lesende Form:

date,dow,sp500,nasdaq 
1/1/16,10,15,8 
1/3/16,5,3,7 
1/5/16,12,18,12 
+0

Sie benötigen D3, um es zu tun, oder können Sie einfach das Array von Werten in Javascript erstellen und dann an D3 füttern? –

+0

@TimConsolazio Ich bevorzuge D3, da es leicht Spaltennamen mit 'd3.keys()' Methode identifiziert. Aber wenn es andere Möglichkeiten gibt, mit dem gewünschten Ergebnis zu enden, bin ich offen für diese. – Username

+0

Werfen Sie einen Blick auf http://StackOverflow.com/a/37323768/4235784. – altocumulus

Antwort

1

Nun, abgesehen von d3.csv.parse(), so scheint es mir, dass dieses Problem nur wenig mit D3 zu tun hat, und kann mit reinem JavaScript gelöst werden:

var csvString = 'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n'; 
 

 
var data = d3.csv.parse(csvString); 
 

 
var headers = d3.keys(data[0]); 
 

 
var myObject = {}; 
 

 
headers.forEach(function(d) { 
 
    myObject[d] = []; 
 
}); 
 

 
data.forEach(function(d) { 
 
    for (var key in d) { 
 
     myObject[key].push(d[key]); 
 
    } 
 

 
}); 
 

 
console.log(myObject);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

0

Unterstrich (nur dazu führen, dass ist, was Im verwendet werden, um Sie regelmäßig js Karte/forEach verwenden könnte)

var csvArray = csvDataString.split(','); 
var keys = _.first(csvArray); 
var values = _.rest(csvArray); 
var asArrayOfObjects = _.map(values, function(row) { 
    var mapping = {}; 
    _.each(row, function(rowItem, i) { mapping[keys[i]] = rowItem }, {}); 
    return mapping; 
}); 
+0

Warum die 'const'-Bezeichner? Was bedeutet 'csv' in Ihrem Beispiel? – Username

+0

ersetzen Sie const mit var, wenn Sie bevorzugen, es ist nur ES6. CSV ist Ihre Zeichenfolge, die die CSV-Daten enthält. Ill aktualisieren Sie die Benennung – Belfordz

+0

Wie würde dieser Code in regulären JS aussehen? – Username

0

Diese Routine analysiert ein Array dieser Zeichenfolgen (unter der Annahme, dass das Format konsistent ist) und gibt sie als ein Array von Zeichenfolgen zurück, die so formatiert sind, wie Sie möchten. Wenn Sie das Objekt und nicht die Strings wollen, ändern Sie die Funktion (ich habe einen Kommentar). Sie sollten in der Lage sein, dies nur D3 zuzuführen.

var d3Data = splitStockStrings ([ 
        'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n', 
        'date,dow,sp500,nasdaq\n1/1/17,10,15,8\n1/3/17,5,3,7\n1/5/17,12,18,12\n' 
       ]); 
    console.log (d3Data); 

    function splitStockStrings (stockStrings) { 
    var newStrings = []; 

    stockStrings.forEach (function (d) {    
     var final = []; 
     d.split ('\n').forEach (function (frag, i) { 
     if (i > 0 && frag.split (',') [ 0 ]) { 
      final.push (frag.split (',') [ 0 ]); 
     } 
     }); 

     var obj = { date : final }; 
     var json = JSON.stringify (obj); 
     newStrings.push (json); 
     // Or if you don't want strings, 
     // comment out the above and uncomment the below... 
     // newStrings.push (obj); 
    }); 

    return newStrings; 
    } 
+0

In meinem Fall würde das Eingabeformat nicht mit den Strings in 'd3Data' übereinstimmen. Meine Zeichenfolgen würden das gleiche Format wie in meinem Code haben. Alle Daten würden in einer Zeichenfolge sein. – Username

+1

Richtig Ich weiß, es ist nicht das Endergebnis, aber das sollte dir die Idee geben. Sie müssen nur auf den Split schauen und die richtigen Werte auswählen, um das, was ich hier gemacht habe, zu erweitern. –

Verwandte Themen