我正在使用D3中的2个csv文件,我想将它们组合在一起。 id
和Grade
对应第一个csv文件,id
和status
对应第二个。 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中执行此操作吗?
答案 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(包含id
和grade
但没有status
),data2
为第二个已解析的CSV(包含id
和status
),您可以使用find
或filter
获取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;
我在两个CSV中加扰行只是为了表明订单并不重要,只有他们的id
。