csv para ordenar en d3.js

Estoy usando esto para analizar un archivo csv y crear una matriz de datos como se especifica en d3 documentos:

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

Sin embargo, si después de este método trato de llamar a data[0] , dice que no está definido. ¿Esto es porque los data son una referencia y una vez que d3.csv() está fuera del scope se destruye? Si este es el caso, ¿cómo puedo superar esto? Necesito referenciar datos de d3.csv()

d3.csv es un método asíncrono. Esto significa que el código dentro de la función de callback se ejecuta cuando se cargan los datos, pero el código después y fuera de la función de callback se ejecutará inmediatamente después de que se realice la solicitud, cuando los datos aún no estén disponibles. En otras palabras:

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

Si desea utilizar los datos cargados por d3.csv, debe colocar el código dentro de la función de callback (donde third , arriba):

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

O bien, puede guardarlo como una variable global en la ventana que luego puede consultar:

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

Si lo desea, también puede asignar los datos cargados explícitamente al objeto ventana, en lugar de declarar una variable y administrar dos nombres diferentes:

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

Creo que tu problema es el tiempo porque es una llamada asincrónica. Por lo tanto, cargue los datos como lo ha hecho, pero llame a la función dentro del código d3 (donde Mike tiene ‘doSomethingWithRows ()’). No siga su código d3 con más procesamiento (donde Mike tiene ‘segundo ()’), mueva ese código a la función ‘doSomethingWithRows ()’. Tendrá los datos disponibles y listo …

Creo que el problema ya está resuelto, pero me enfrenté a un problema similar y la discusión anterior no fue tan útil. Así que publicando cómo calculé una salida a este problema: aquí, la razón por data[0] cual los data[0] no están definidos es probablemente porque los datos en sí mismos no son leídos por el navegador. Esta falla en la lectura probablemente se debe a la carga directa del archivo de datos (csv), es decir, utilizando el siguiente comando d3.csv("myCSVfile.csv",....) . Este enfoque puede no funcionar porque las aplicaciones web normalmente requieren cargar archivos de los servidores web (no estoy seguro de por qué este es el caso). Por lo tanto, un servidor web local debe implementarse. Utilice este foro para aprender cómo: cómo configuro un servidor HTTP local usando Python . El código actualizado, si usa Python 3 para crear un servidor web local, será: d3.csv("http://localhost:8000/myCSVfile.csv",.....) .

Podría declarar una variable fuera de la función de callback y luego asignarla con los valores de la csv:

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

y luego use csv_data fuera de la callback