【问题标题】:Sorting CSV data in JS object对 JS 对象中的 CSV 数据进行排序
【发布时间】:2020-12-15 21:12:20
【问题描述】:

我需要一些帮助,用 JS 对 1370 行 CSV 数据进行排序!我正在使用 d3 库来创建数据可视化。

CSV 在这里:https://github.com/nickrinaldi88/BreitBart_DataVis/blob/main/breitbartData.csv

我的项目

我有一个包含 3 列的 csv 文件:日期、单词和计数。

基本上,我想为每个唯一的单词设置 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 函数吗?

我发现自己试图在循环中动态创建数组,但我很难得到我想要的结果。朝着正确的方向前进会有所帮助。

谢谢!

【问题讨论】:

  • 您在 CSV 中有两个 5 月 8 日的许多单词,当给定名称有重复行时,您想求和吗?或者这是数据中的问题?
  • 啊,很好的发现。我想它应该是 5 月 7 日,所以我手动更改了它。在五月初,还会有一些日期跳过。这是因为我有一个收集这些数据的脚本,而那些日子它没有运行。
  • 我的问题没有完全回答。我只会选择其中一个回复。很抱歉给您带来不便。

标签: javascript csv d3.js


【解决方案1】:

这是一种使用原生 JavaScript 的方法。

免责声明这是一种相当昂贵的方法,只需付出一点努力就可以优化性能。

首先获取数据...

然后开始处理 CSV:

  1. 拆分 CSV 字符串(拆分)
  2. 删除标题(切片)
  3. 过滤掉最终的空字符串(过滤器)
  4. 迭代字符串数组以创建数组数组(映射)
function processCSV(csv){
  return csv.split("\r\n").slice(1).filter(c=>c).map(d=>d.split(','));
}

然后找到唯一的词:

  1. 使用 Set 确保只有唯一值
  2. 迭代数据以提取唯一词并添加到集合中
  3. 返回唯一单词数组和数据
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("\r\n").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();
}

最后,这里有一个repl来演示结果:

https://repl.it/@randycasburn/AlertPoorCodes

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2013-10-22
    • 2015-10-19
    • 2012-12-26
    • 2023-03-21
    • 2020-04-16
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多