使用过滤

时间:2018-06-05 21:58:27

标签: javascript d3.js

我正在使用D3中的2个csv文件,我想将它们组合在一起。 idGrade对应第一个csv文件,idstatus对应第二个。 id在两个文件中都是相同的。

要将文件从字符串转换为整数,我使用类似

的内容
 data.forEach(function(d) {
   d.id = d.id;
   d.Grade = +d.Grade;
 });

 data2.forEach(function(d) {
   d.id = d.id;
   d.Status = d.Status;
 });

我真正想要的是将Status添加到data的相应ID中。实际上要检查id是否相同,并根据id将Status添加为新列。知道如何在javascript中执行此操作吗?

2 个答案:

答案 0 :(得分:1)

在JS中读取和保存文件的最简单方法是使用Node.js.所以这是用Node.js和data-forge编写的工作示例:



const dataForge = require('data-forge');

/**
 * "csv1.csv":
 *
 * id, grade
 * 123, 1,
 * 345, 4,
 * 177, 5,
 */
const dataFrameGrades = dataForge.readFileSync('csv1.csv').parseCSV();

/**
 * csv2.csv:
 *
 * id, status
 * 123, 'yes',
 * 345, 'no',
 * 177, 'yes',
 */
const dataFrameStatuses = dataForge.readFileSync('csv2.csv').parseCSV();

/**
 * Merge columns from two CSV
 * 
 * dataFrame1 is left
 * dataFrame2 is right
 */
const dataFrameMerged = dataFrameGrades.join(
  dataFrameStatuses,
  grade => grade.id,
  status => status.id,
  (grade, status) => {
    return {
      id: grade.id,
      grade: grade.grade,
      status: status.status
    };
  }
);

/** Save CSV */
dataFrameMerged.asCSV().writeFileSync('csvMeged.csv');




答案 1 :(得分:1)

有几种方法可以做到这一点。假设data1为第一个已解析的CSV(包含idgrade但没有status),data2为第二个已解析的CSV(包含idstatus),您可以使用findfilter获取data2中的相应对象,并在status上复制其data1

例如,使用find

data1.forEach(function(d) {
  var obj = data2.find(function(e) {
    return d.id === e.id
  });
  d.status = obj.status;
});

这是一个演示(使用d3.csvParse,因为S.O.代码段不允许使用真实的CSV):



var csv1 = `id,grade
1,42
2,65
3,17`;

var csv2 = `id,status
2,yes
1,no
3,no`;

var data1 = d3.csvParse(csv1);
var data2 = d3.csvParse(csv2);

data1.forEach(function(d) {
  var obj = data2.find(function(e) {
    return d.id === e.id
  });
  d.status = obj.status;
});

console.log(data1)

<script src="https://d3js.org/d3.v5.min.js"></script>
&#13;
&#13;
&#13;

我在两个CSV中加扰行只是为了表明订单并不重要,只有他们的id