2013-10-31 4 views
6

मान लीजिए के साथ मेरे पास इस CSV फ़ाइलएक CSV फ़ाइल की पंक्तियों की संख्या की गणना, d3.js

Day,What 
2013-10-27,Apple 
2013-10-27,Cake 
2013-10-27,Apple 
2013-10-28,Apple 
2013-10-28,Apple 
2013-10-28,Blueberry 
2013-10-28,Orange 

मैं D3.js एक समय श्रृंखला ग्राफ के साथ तैयार करना चाहते हैं। मुझे बस इतना करना है कि प्रत्येक दिन पंक्तियों की संख्या प्रदर्शित करें। उदाहरण के तौर पर, 27 नवंबर में मूल्य के रूप में 3 होना चाहिए, 28 वें होना चाहिए 4.

क्या कोई तरीका है कि मैं इसे संग्रहीत कर सकता हूं? मैं बिना किसी सकारात्मक परिणाम के सीएसवी के बाहर एक नया डेटासेट बनाने की कोशिश कर रहा हूं।

var dataset; 

d3.csv("data.csv", function(d) { 
    return { 
    Day: new Date(d.Day), 
    What: d.What 
    }; 
}, 

function(error, rows) { 
    dataset = rows; 
    // I SUPPOSE THE FUNCTION THAT GENERATE THE NEW DATASET SHOULD GO THERE  
}); 

उत्तर

2

आप एक सूचकांक के रूप में जावास्क्रिप्ट ऑब्जेक्ट संपत्तियों की तेजी देखने का उपयोग जब आप अपने मायने रखता जमा कर सकते हैं:

var counts = {}; 
rows.forEach(function(r) { 
    if (!counts[r.Day]) { 
     counts[r.Day] = 0; 
    } 
    counts[r.Day]++; 
}); 

तो फिर तुम इस वापस एक सरणी में परिवर्तित करने के लिए ताकि आप इसे उपयोग कर सकते हैं की आवश्यकता होगी डी 3 के साथ:

var data = []; 
Object.keys(counts).forEach(function(key) { 
    data.push({ 
     day: key, 
     count: counts[key] 
    }); 
}); 

मैं यहाँ यह सोचते कर रहा हूँ कि आप क्योंकि आप केवल कुछ दिनों के गिनती के योग के बारे में बात की "क्या" कॉलम को अनदेखा करना चाहते हैं और एक ही दिन के लिए अलग "क्या" मूल्यों देखते हैं। यदि आप गिनते समय "क्या" पर विचार करना चाहते हैं तो आप इसे अपने मूल counts ऑब्जेक्ट (r.Day + r.What) की कुंजी में बना सकते हैं।

संपादित करें: टिप्पणी के आधार पर, एक कंपाउंड कुंजी के साथ कोड जोड़ना।

var counts = {}; 
rows.forEach(function(r) { 
    var key = r.Day + r.What; 
    if (!counts[key]) { 
     counts[key] = { 
      day: r.Day, 
      what: r.What, 
      count: 0 
     }; 
    } 
    counts[key].count++; 
}); 

var data = []; 
Object.keys(counts).forEach(function(key) { 
    data.push(counts[key]); 
}); 
+0

यह पूरी तरह से काम करता है, धन्यवाद। सिर्फ एक और सवाल: मैंने + r जोड़ा है। क्या और हाँ, दिन के आधार पर प्रत्येक श्रेणी के लिए अलग-अलग गिनती बनाना बहुत उपयोगी है, लेकिन उस समय नई सरणी की दिनांक/कुंजी अब दिनांक नहीं है (चूंकि यह आर के साथ जंजीर है। क्या)। क्या कोई तरीका है - data.push ({}) में; बिट - एक पठनीय सही ढंग से स्वरूपित दिनांक रखने के लिए, और एक गिनती और एक "श्रेणी" रखने के लिए, उन्हें अलग रखने के लिए? – philapple

+0

हाँ, यदि आप दोनों गुणों को एक कंपाउंड कुंजी के रूप में उपयोग करते हैं तो आप कुंजी को "दिन" मान के रूप में उपयोग नहीं कर सकते हैं। लेकिन आप गुणों को 'counts' ऑब्जेक्ट्स में स्वयं बनाकर ठीक कर सकते हैं। फिर आप ऑब्जेक्ट संदर्भों को सरणी में कॉपी कर सकते हैं। मैंने कुछ नमूना कोड के साथ इसका जवाब अपडेट किया है। –

0

इन पंक्तियों के साथ एक कार्य चाल चलाना चाहिए। मैं इस समय कंप्यूटर पर इसका परीक्षण नहीं कर सकता, इसलिए मुझे बताएं कि यह काम नहीं करता है क्योंकि मैंने टाइपो बनाया होगा!

function createNewArray(dataset) { 
    var lastDate = dataset[0].Date; // initialise 
    var count = 0; 
    var newArray = new Array(); 
    for (var i = 0; i < dataset.length; i++) { 
     if (dataset[i].Date != lastDate || i == dataset.length-1) { 
      // on a new day (or the final row), so push value and reset count variable 
      newArray.push({ Day: lastDate, Count: count }); 
      count = 0; 
     }   
     count++;   
     lastDate = dataset[i].Date; 
    } 
    return newArray; 
} 
संबंधित मुद्दे