如何从 Axios GET 请求解析 Node/Express 上的 CSV 文件?

Joh*_*ger 1 csv ajax node.js express axios

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

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

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

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

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

在响应中有一个Content-Disposition参数,内容为attachment; filename=name_of_file.csv

如果有帮助的话?

提前欢呼并致谢!

Rod*_*A92 9

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

1) 从 URL 获取 CSV

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

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

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

2)获取字符串形式的值

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

file.text().then((csvStr) => {
  console.log(csvStr);
})
Run Code Online (Sandbox Code Playgroud)

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

Title1,Title2,Title3
one,two,three
example1,example2,example3
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你这样做:

const jsonObj = csvJSON(csvStr);
console.log(jsonObj);
Run Code Online (Sandbox Code Playgroud)

jsonObj您将以您想要的对象的形式进入CSV!

B)使用一些可以为您做到这一点的第三方库

在这里,您可能会找到一些选择。随意选择您喜欢的任何内容。我选择了CSVTOJSON并将按照相同的示例进行展示:

import csvToJson from 'csvtojson';

...

csvToJson()
  .fromString(csvStr)
  .then((jsonObj)=>{
    console.log(jsonObj);
  });
Run Code Online (Sandbox Code Playgroud)

这样,您也将以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);
     })
    });
Run Code Online (Sandbox Code Playgroud)

选择什么选项?

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

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