首页 > 解决方案 > 如何从 Axios GET 请求解析 Node/Express 上的 CSV 文件?

问题描述

我正在向 URL 端点发出 GET 请求,该端点使用 axios 在 Node/Express 设置上发回 CSV 文件。

如何读取此文件并将其解析为包含每行数据对象的数组?我喜欢“neat-csv”如何处理解析的示例,但我愿意接受建议。

const response = await axios.get("url/end/point",{ responseType: 'blob',}); 

到目前为止,除了请求之外,我没有任何实际的实现示例,因为我对从哪里开始没有明确的看法,而且我在网上找不到任何好的指南。我找到的所有指南都涉及请求一个文件,然后将其保存到我不想要的文件系统中。我只是想请求文件,解析它,然后通过我拥有的 Socket.io 连接广播 CSV 文件中的数据。

Logginresponse.data清楚地给出了数据输出,但当然没有格式化。只是原始数据/文本。

在响应中有一个Content-Disposition参数读取attachment; filename=name_of_file.csv

如果这有帮助?

提前干杯和感谢!

标签: node.jsajaxcsvexpressaxios

解决方案


可能您已经找到了答案,但我认为值得在这里添加一些内容,以防万一:

1) 从 URL 获取 CSV

因此,您从 axios 请求中将 CSV 作为 BLOB 获取。到目前为止,一切都很好!正如你所说:

const response = await axios.get("url/end/point",{ responseType: 'blob',});
const file = response.data;

在这里,您可以(并在网上找到)不同的方法来制作对象。

2) 以字符串形式获取值

首先,要将其记录为正确的字符串,您可以执行以下操作:

file.text().then((csvStr) => {
  console.log(csvStr);
})

它将记录如下内容(作为字符串):

Title1,Title2,Title3
one,two,three
example1,example2,example3

3)将其解析为对象

在这里,您有不同的选择。主要是:

A) 编写自己的函数将字符串作为 CSV 解析为对象

我在 StackOverflow 上找到的一个很好的例子来自 Wesley Smith 的这个回答

function csvJSON(csvStr){
  var lines=csvStr.split("\n");
  var result = [];

  // NOTE: If your columns contain commas in their values, you'll need
  // to deal with those before doing the next step 
  // (you might convert them to &&& or something, then covert them back later)
  // jsfiddle showing the issue https://jsfiddle.net/
  var headers=lines[0].split(",");

  for(var i=1;i<lines.length;i++){

      var obj = {};
      var currentline=lines[i].split(",");

      for(var j=0;j<headers.length;j++){
          obj[headers[j]] = currentline[j];
      }

      result.push(obj);

  }
  return result; //JavaScript object
}

现在,如果你这样做:

const jsonObj = csvJSON(csvStr);
console.log(jsonObj);

您将以所需jsonObj对象的形式进入 CSV!

B)使用一些为你做的第三方库

在这里,您可能会找到一些选项。随意选择你喜欢的任何东西。我选择了CSVTOJSON并将按照相同的示例显示它:

import csvToJson from 'csvtojson';

...

csvToJson()
  .fromString(csvStr)
  .then((jsonObj)=>{
    console.log(jsonObj);
  });

像这样,您还将jsonObj以所需对象的形式进入 CSV!

使用任何选项AB,您将获得:

CSV 作为 JS 对象

注意: 在这两个选项中,您可能必须在then()块内实现转换,因为当您准备好使用字符串值时它就在那里:

... 
file.text().then((csvStr) => {
  // Option A
  const jsonObj1 = csvJSON(csvStr);
  console.log(jsonObj1);

  // Option B
  csvToJson()
    .fromString(csvStr)
    .then((jsonObj2)=>{
      console.log(jsonObj2);
     })
    });

选择什么选项?

这取决于您和您使用的 CSV 文件。最好考虑:

  • 如果您有一个众所周知的小文件,那么使用第三方库可能是矫枉过正。
  • 另一方面,当您的文件可能包含一些棘手的内容(如内部逗号、其他一些分隔符或可能导致转换失败的额外字符)时,实现您自己的函数,那么函数可能需要额外的工作,因此会让人头疼。
  • 您可能要考虑的其他一些事情是文件的大小。如果它非常大,并且您正在实现自己的功能,那么您将希望以一种非常高效的方式来完成它。如果您使用的是第三方库(一个不错的库),则不必为此担心太多。

推荐阅读