如何使用JavaScript/NodeJS将一个csv文件中的数据与另一个csv文件中的数据进行匹配并将它们合并组合起来?

col17t5w  于 9个月前  发布在  Java
关注(0)|答案(1)|浏览(98)

例如,假设我在两个不同的单独的csv文件中有以下数据:
population.csv:

city        | State         | Population
-----------------------------------------
Seattle     | Washington    | 63269
Birmingham  | Alabama       | 212113

字符串
temperature.csv:

index | city         | JAN | FEB | ANN
-----------------------------------------
0     | Birmingham   | 46  | 53  | 
3     | Juneau       | 19  | 25  | 38


我如何从这2个csv文件中合并相应的数据(根据每一行是否为同一城市),以便我的数据和列合并形成以下内容(如果没有重叠,请将这些行留空):

index | city         | JAN | FEB | ANN | State      | Population
-------------------------------------------------------------------------
0     | Birmingham   | 46  | 53  |     | Alabama    | 212113
3     | Juneau       | 19  | 25  | 38  |            |
      | Seattle      |     |     |     | Washington | 63269


时间复杂度为O(n^2):

const popRows = await parse(fs.readFileSync('./data/population.csv', 'utf8'), {
    columns: true,
    delimiter: ',',
});

const tempRows = await parse(fs.readFileSync('./data/temperature.csv', 'utf8'), {
    columns: true,
    delimiter: ',',
});

const combinedRows = [];

popRows.forEach(popRow => {
   tempRows.forEach(tempRow => if (popRow.city === tempRow.city) combinedRows.push({...popRow, ...tempRow}))
});


我是在正确的轨道上,还是有一个不同的方式,我应该接近这个?任何指导或链接到一个类似的问题,以及他们如何解决它将不胜感激。谢谢。

a8jjtwal

a8jjtwal1#

这似乎是一个合理的解决方案,但是,如果你能保证两个工作表有相同的行数,你可以把它减少到一个循环:

const combinedRows = [];

if (popRows.length !== tempRows.length) {
  throw new Error("Population and temperature data must have the same number of rows");
}

const numRows = popRows.length;
for (let i = 0; i < numRows.length; i++) {
  combinedRows.push({ ...popRows[i], ...tempRows[i] });
}

字符串
如果你希望数据的排序顺序相同,你可以在for循环中做其他的验证,比如确保popRows[i].city === tempRows[i].city。我同意@cbr的观点,如果你想支持无序数据,使用Map是一个很好的解决方案。

相关问题