Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

csv to array in d3.js

Tags:

csv

d3.js

I am using this to parse a csv file and create an array data as specified in d3 docs:

d3.csv("afile.csv", function(data) {     data.forEach(function(d) {     d.date = formatDate.parse(d.date);     d.price = +d.price; }); 

However, if after this method I try to call data[0] it says it is undefined. Is this because data is a reference and once d3.csv() is out of scope is destroyed? If this is the case how can I overcome this. I need to reference data out of d3.csv()

like image 761
George Eracleous Avatar asked Feb 29 '12 00:02

George Eracleous


People also ask

Is d3 CSV asynchronous?

d3. csv is asynchronous by design to prevent pages from freezing up, so that can't be changed without changing the d3 library itself.

What is d3 nest?

nest() function is used to group the data as groupBy clause does in SQL. It groups the data on the basis of keys and values. Syntax: d3.nest() Parameters: This function does not accept any parameters. Return Value: It returns the object with several properties as entries, keys, values, map, sort.

Is the syntax to read JSON data in d3?

json() function is used to fetch the JSON file. If this function got an init parameter, then this is called along with the fetch operation. Syntax: d3.


2 Answers

d3.csv is an asynchronous method. This means that code inside the callback function is run when the data is loaded, but code after and outside the callback function will be run immediately after the request is made, when the data is not yet available. In other words:

first(); d3.csv("path/to/file.csv", function(rows) {   third(); }); second(); 

If you want to use the data that is loaded by d3.csv, you either need to put that code inside the callback function (where third is, above):

d3.csv("path/to/file.csv", function(rows) {   doSomethingWithRows(rows); });  function doSomethingWithRows(rows) {   // do something with rows } 

Or, you might save it as a global variable on the window that you can then refer to later:

var rows;  d3.csv("path/to/file.csv", function(loadedRows) {   rows = loadedRows;   doSomethingWithRows(); });  function doSomethingWithRows() {   // do something with rows } 

If you want, you can also assign the loaded data explicitly to the window object, rather than declaring a variable and then managing two different names:

d3.csv("path/to/file.csv", function(rows) {   window.rows = rows;   doSomethingWithRows(); });  function doSomethingWithRows() {   // do something with rows } 
like image 121
mbostock Avatar answered Oct 11 '22 21:10

mbostock


I think your problem is timing because it is an async call. So, load the data as you have but call the function within the d3 code (where Mike has 'doSomethingWithRows()'). Don't follow your d3 code with any more processing (where Mike has 'second()'), move that code into the 'doSomethingWithRows()' function. It will have the data available and away you go...

like image 33
Andrew-NZ Avatar answered Oct 11 '22 21:10

Andrew-NZ