我需要一些帮助,用JS对1370行CSV数据进行排序!我正在使用d3库创建一个数据可视化。
CSV在这里:https://github.com/nickrinaldi88/BreitBart_DataVis/blob/main/breitbartData.csv
我的项目:
我有一个csv文件,有3列,日期,单词和计数。
本质上,我想为每个唯一的单词(有10个唯一的单词(有10个不同的对象数组,比如:
var Obama = [{date: 'the date', count: 72}, {date: 'the date', count: 41}]
var Trump = [{date: 'the date', count: 568}, {date: 'the date', count: 92}]
对于每个单词,都有136行数据,这意味着理想情况下,我希望每个数组包含136个对象,这些对象对应于现有的日期和计数属性。
我应该使用d3.nest函数吗?
我发现自己试图在循环中动态创建数组,但很难得到我想要的结果。朝着正确的方向推动会有所帮助。
谢谢!
这里有一种使用普通JavaScript的方法。
免责声明这是一种非常昂贵的方法,只要付出一点努力就可以优化性能。
首先获取数据。。。
然后通过处理CSV:开始
- 拆分CSV字符串(拆分(
- 移除收割台(切片(
- 筛选出最后一个空字符串(筛选器(
- 迭代字符串数组以创建数组数组(map(
function processCSV(csv){
return csv.split("rn").slice(1).filter(c=>c).map(d=>d.split(','));
}
然后找到唯一的单词:
- 使用集合确保只有唯一的值
- 迭代数据以提取唯一的单词并添加到集合中
- 返回唯一单词和数据的数组
function findUniqueWords(data){
const words = new Set();
data.forEach(d=>{
words.add(d[1]);
});
return [Array.from(words), data];
}
然后创建所需的格式化对象数组:
- 迭代唯一的单词
- 只筛选包含该单词的记录的数据
- 迭代这些记录以创建所需的格式
function createArrays(args) {
const [words,data] = [...args];
return words.map(w=>{
return data.filter(record=>record[1] === w).map(fd=>{
return {[w]:{date:fd[0], count: fd[2]}};
});
}).flat();
}
然后对输出执行某些操作
这是完整的代码。由于CORS的限制,此代码将不会在此处运行。
fetch('https://raw.githubusercontent.com/nickrinaldi88/BreitBart_DataVis/main/breitbartData.csv')
.then(res=>res.text())
.then(processCSV)
.then(findUniqueWords)
.then(createArrays)
.then(console.log);
function processCSV(csv){
return csv.split("rn").slice(1).filter(c=>c).map(d=>d.split(','));
}
function findUniqueWords(data){
const words = new Set();
data.forEach(d=>{
words.add(d[1]);
});
return [Array.from(words), data];
}
function createArrays(args) {
const [words,data] = [...args];
return words.map(w=>{
return data.filter(record=>record[1] === w).map(fd=>{
return {[w]:{date:fd[0], count: fd[2]}};
});
}).flat();
}
最后,这里有一个演示结果的回复:
https://repl.it/@randycasburn/AlertPoorCodes