csv do tablicy w d3.js
Używam tego do analizy pliku csv i utworzenia tablicy danych, jak określono w dokumentach d3:
d3.csv("afile.csv", function(data) {
data.forEach(function(d) {
d.date = formatDate.parse(d.date);
d.price = +d.price;
});
Jednakże, jeśli po tej metodzie próbuję wywołać {[1] } to mówi, że jest niezdefiniowana. Czy to dlatego, że data
jest odniesieniem, a gdy {[3] } jest poza zasięgiem, zostaje zniszczony? Jeśli tak jest, jak Mogę to przezwyciężyć. I need to reference data out of d3.csv()
4 answers
D3.csv jest metodą asynchroniczną. Oznacza to, że kod wewnątrz funkcji wywołania zwrotnego jest uruchamiany po załadowaniu danych, ale kod PO i poza funkcja wywołania zwrotnego zostanie uruchomiona natychmiast po złożeniu żądania, gdy dane nie są jeszcze dostępne. Innymi słowy:
first();
d3.csv("path/to/file.csv", function(rows) {
third();
});
second();
Jeśli chcesz użyć danych załadowanych przez d3.csv, musisz albo umieścić ten kod wewnątrz funkcji zwrotnej (gdzie third
jest, powyżej):
d3.csv("path/to/file.csv", function(rows) {
doSomethingWithRows(rows);
});
function doSomethingWithRows(rows) {
// do something with rows
}
Lub możesz zapisać go jako globalny zmienna w oknie, do której później możesz się odwołać:
var rows;
d3.csv("path/to/file.csv", function(loadedRows) {
rows = loadedRows;
doSomethingWithRows();
});
function doSomethingWithRows() {
// do something with rows
}
Jeśli chcesz, możesz również przypisać załadowane dane jawnie do obiektu window, zamiast deklarować zmienną i zarządzać dwoma różnymi nazwami:
d3.csv("path/to/file.csv", function(rows) {
window.rows = rows;
doSomethingWithRows();
});
function doSomethingWithRows() {
// do something with rows
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-29 00:41:35
Myślę, że Twoim problemem jest wyczucie czasu, ponieważ jest to połączenie asynchroniczne. Więc załaduj dane tak, jak masz, ale wywołaj funkcję w kodzie d3 (gdzie Mike ma ' doSomethingWithRows()'). Nie podążaj za swoim kodem d3 z jakimkolwiek przetwarzaniem (gdzie Mike ma 'second ()'), przenieś ten kod do funkcji' doSomethingWithRows ()'. Będzie miał dostępne Dane i można odejść...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 04:50:03
Myślę, że problem jest już rozwiązany, ale spotkałem się z podobnym problemem i powyższa dyskusja nie była tak pomocna. Więc publikując, jak wymyśliłem wyjście z tego problemu: tutaj powodem, dla którego data[0]
jest niezdefiniowany, jest prawdopodobnie dlatego, że same dane nie są odczytywane przez przeglądarkę. Ten brak odczytu jest prawdopodobnie spowodowany bezpośrednim załadowaniem pliku danych (csv), tzn. za pomocą następującego polecenia d3.csv("myCSVfile.csv",....)
. Takie podejście może nie działać, ponieważ aplikacje internetowe zwykle wymagają ładowania plików z serwerów WWW (nie pewnie, dlaczego tak jest). Więc lokalny serwer WWW musi być wprowadzony. Użyj tego forum, aby dowiedzieć się, jak: Jak skonfigurować lokalny serwer HTTP za pomocą Pythona . Zaktualizowany Kod, jeśli używasz Pythona 3 do tworzenia lokalnego serwera www będzie: d3.csv("http://localhost:8000/myCSVfile.csv",.....)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 21:14:57
Można zadeklarować zmienną poza funkcją callback, a następnie przypisać ją wartościami z pliku 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;
});
A następnie użyj csv_data poza wywołaniem zwrotnym
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-29 00:37:21